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

dea*_*mer 14 command-line-interface nix mv wildcards

这是一个有点尴尬的问题,但我不得不承认,在我职业生涯的后期,我仍然对 mv 命令有疑问。

我经常遇到这个问题:我需要将所有文件递归地向上移动一层。假设我有文件夹 foo,里面有一个文件夹 bar。Bar 有一堆文件和文件夹,包括点文件和文件夹。如何将 bar 中的所有内容移动到 foo 级别?

如果 foo 为空,我只需将 bar 移到上一层,删除 foo 并将 bar 重命名为 foo。部分问题是我无法弄清楚“包括点在内的一切”的 mv 通配符是什么。这个问题的一部分是 - 是否有对 cp 和 mv 命令在某处使用的通配符的深入讨论(谷歌搜索这只会带来非常基本的教程)。

Den*_*son 19

在 Bash(和其他一些)中,您可以使用大括号扩展在一行中完成此操作:

mv bar/{,.}* .
Run Code Online (Sandbox Code Playgroud)

逗号分隔空值和点,因此该mv命令会看到匹配*.*

  • 匿名用户建议:`消除也匹配“.”导致的错误。和“..”,使用这个命令: mv bar/{,.[!.],..?}* .` (3认同)

Mat*_*ons 2

最简单的方法是用两个命令来执行此操作,因为 * 与 .whatever 不匹配

cd /foo
mv bar/* ./
mv bar/.??* ./
Run Code Online (Sandbox Code Playgroud)

你不想使用我在犯这个错误时发现的 bar/.* :

rm -rf ./.* 
Run Code Online (Sandbox Code Playgroud)

这是一件坏事。有人想猜猜为什么吗?;-)