这是一个有点令人尴尬的问题,但我不得不承认,在我的职业生涯的后期,我仍然对 mv 命令存在疑问。
我经常遇到这个问题:我需要将所有文件递归地向上移动一层。假设我有一个文件夹 foo,里面有一个文件夹 bar。Bar 里有一堆文件和文件夹,包括点文件和文件夹。我该如何将 bar 中的所有内容移动到 foo 层?
如果 foo 为空,我只需将 bar 移到上一级,删除 foo 并将 bar 重命名为 foo。部分问题在于我无法弄清楚 mv 的“包括点在内的所有内容”通配符是什么。这个问题的一部分是 - 是否有关于 cp 和 mv 命令使用的通配符的深入讨论(谷歌搜索只会带来非常基本的教程)。
答案1
在 Bash(以及其他一些 Bash)中,可以使用括号扩展在一行中完成此操作:
mv bar/{,.}* .
逗号分隔空值和点,因此该mv
命令会看到匹配的文件名*
,并且.*
答案2
这将从子文件夹中获取所有文件并将其移动到当前目录
find . -type f -exec mv -iv \{} . \;
如果你想拥有同名文件,请使用
yes y | find . -type f -exec mv -iv \{} . \;
答案3
最简单的方法是用两个命令来执行此操作,因为 * 与 .whatever 不匹配
cd /foo
mv bar/* ./
mv bar/.??* ./
您不想使用 bar/.*,这是我在犯这个错误时发现的:
rm -rf ./.*
这是一件坏事。有人想猜一下为什么吗?;-)
答案4
mv .??* *
会处理除点后跟单个字符之外的所有内容。如果这种情况很常见,您可以添加.[a-zA-Z0-9]*
。这样仍会留下带有诸如.;
、.^
和.^I
(tab) 之类的名称的文件。如果您需要处理所有内容,则需要更复杂一些。
mv .. `ls -f | egrep -v '^.$|^..$'