如何将子文件夹中的所有文件(包括隐藏文件)递归移动到 *nix 中的父文件夹中?

如何将子文件夹中的所有文件(包括隐藏文件)递归移动到 *nix 中的父文件夹中?

这是一个有点令人尴尬的问题,但我不得不承认,在我的职业生涯的后期,我仍然对 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 '^.$|^..$'

相关内容