这是一个尴尬的问题,但我不得不承认,在我职业生涯的这个晚期,我仍然对mv命令有疑问。
我经常遇到这个问题:我需要将所有文件recursion地上移一个级别。 比方说,我有文件夹foo,里面有一个文件夹栏。 酒吧有一堆文件和文件夹,包括点文件和文件夹。 我怎么把酒吧里的一切都搬到foo的水平呢?
如果foo是空的,我只需移动上面的一级,删除foo并重命名为foo。 部分问题是我无法弄清楚“包括点在内的所有东西”的mv通配符是什么。 这个问题的一部分是这样的 – 有没有深入的讨论通配符和mv命令使用的通配符(谷歌search这只会带来非常基本的教程)。
在Bash(和其他一些)中,你可以使用括号扩展来完成这一行:
mv bar/{,.}* .
逗号分隔一个空和一个点,所以mv
命令看到匹配*
和.*
文件名
最简单的方法是用两个命令来完成,因为*不匹配
cd /foo mv bar/* ./ mv bar/.??* ./
你不想在使用bar /.*的时候发现这个错误:
rm -rf ./.*
这是一件坏事。 任何人都想猜测为什么? 😉
首先要了解globbing – 这是由shell完成的,而不是命令。 检查你的shell的手册页的所有细节。
这个从子文件夹收集所有文件,并将它们移动到当前目录
find . -type f -exec mv -iv \{} . \;
如果您要使用相同的名称进行文件的写入,请使用
yes y | find . -type f -exec mv -iv \{} . \;
mv .??* *
将处理除点之后的任何内容,后面跟单个字符。 如果这种情况对您的情况很常见,可以添加.[a-zA-Z0-9]*
。 这仍然会留下名称如.;
文件.;
, .^
和.^I
(tab)。 如果你需要处理所有事情,你需要更复杂一些。
mv .. `ls -f | egrep -v '^.$|^..$'
如果你有一个目录结构/foo/bar/
并且你想要将所有文件移动到上面一个bar
下方,进入bar
目录并input以下命令:
find . -depth -print0 | cpio --null -pvd ../
一般来说,我认为cpio(1)
对于这些任务更好。 您可以通过在shell中发布info cpio
来查看详细的文档。