在Linux中将目录中的所有文件复制到本地子目录

6

我有一个具有以下结构的目录:

file_1
file_2
dir_1
dir_2
# etc.
new_subdir

我想在此目录中复制所有现有的文件和目录到 new_subdir 中。如何通过Linux终端实现?

你并没有在移动,而是在复制。 - AlxVallejo
3个回答

5

这是一个老问题,但没有一个答案是有效的(它们会递归地将目标文件夹复制到自身),所以我想提供一些可行的示例:

使用find -exec进行复制:

find . ! -regex '.*/new_subdir' ! -regex '.' -exec cp -r '{}' new_subdir \;

此代码使用正则表达式查找所有不是new_subdir的文件和目录(在当前目录中),并将它们复制到new_subdir。 ! -regex '.' 部分用于避免包括当前目录本身。使用find是我知道的最强大的技术,但它有时会很冗长且有点令人困惑。

使用extglob进行复制:

cp -r !(new_subdir) new_subdir

如果您的bash终端启用了extglob (这可能是情况),则可以使用!将当前目录中所有不是new_subdir的内容复制到new_subdir中。

不使用extglob进行复制:

mv * new_subdir ; cp -r new_subdir/* .

如果您没有extglob,find对您没有吸引力,而您真的想做一些hacky的事情,您可以将所有文件移动到子目录中,然后递归地将它们复制回原始目录。与cp将目标文件夹复制到自身不同,mv在尝试将目标文件夹移动到自身时会引发错误。(但它成功地移动了每个其他文件和文件夹.)


3
你的意思是像这样吗?
cp -R * new_subdir

cp 命令使用 -R 参数表示递归复制(也就是复制目录),* 表示所有文件(和目录)。

尽管 * 包括了 new_subdir 本身,但是 cp 检测到这种情况后会忽略 new_subdir (所以不会把它复制到自己里面!)


如果您想确保new_subdir被排除在*之外且不生成警告,则可能还想查看这个 - Shahbaz
在 macOS 中,这将循环。 - Christian Vincenzo Traina

1
尝试类似以下的内容:
 cp -R * /path_to_new_dir/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接