如何将某种类型的所有文件移动(或复制)到Unix中的目录中?


22

我还不太熟悉所有的技巧grep/find/awk/xargs

我说有一些文件匹配特定的模式*.xxx。这些文件在某个目录中的随机位置。如何找到所有此类文件,并将它们移动到Unix上我的主目录中的文件夹(可能还不存在)?


4
在谈论“文件类型”时,您必须要小心。在unixy环境中,“。xxx”示例甚至不是Windows的扩展名。“ .xxx”仅构成文件名的后缀。“文件类型”是以下几种类别中的一种:常规文件,设备文件,符号链接,目录,命名管道,Unix系列套接字,也许还有其他几种。
Bruce Ediger '02


@BruceEdiger谢谢,我想我的意思是“文件名模式”
qodeninja 2012年

Answers:


22
mkdir ~/dst
find source -name "*.xxx" -exec mv -i {} -t ~/dst \;

1
我会使用mv -i -t ~/dst {} +
enzotib'2

17

如果你想一个目录层次结构中的所有文件移动到一个单一的目标目录,在bash≥4(放shopt -s globstar你的~/.bashrc)或zsh中:

mkdir ~/new-directory
mv -i **/*.xxx ~/new-directory

在其他shell中:

mkdir ~/new-directory
find . -name '*.xxx' -exec mv -i {} ~/new-directory \;

如何读取此find命令:

  • .:遍历当前目录
  • -name '*.xxx':对名称与此模式匹配的文件进行操作
  • -exec … \;:对每个文件执行此命令,替换{}为文件路径

find如果您有许多文件,则有一个更复杂的命令使用它会更快,因为它不需要mv为每个文件调用单独的进程:

find . -name '*.xxx' -exec sh -c 'mv -i "$@" "$0"' ~/new-directory {} +

+在年底讲述find在同一时间调用多个文件的命令。由于find只能将文件名放在命令行的末尾,并且mv需要将目标目录放在最后,因此我们使用中间shell重新排列参数("$0"是shell的第一个参数~/new-directory,而"$@"后面的参数来自find的扩展{})。


4

如果要将匹配的源文件的目录结构复制到新的目标目录,则可以使用GNU cp的--parents选项:

mkdir /path/to/target_dir
cd source_dir
find . -name '*.xxx' -exec cp -iv --parents -t /path/to/target_dir {} +

3

您可以使用查找不-exec‍和:

mkdir /path/to/dest    
cp `find /path/to/source -name "*.jar"` /path/to/dest

1
但是请注意,这find -exec要安全得多。例如,上述操作将对包含空格的文件名失败。
dhag 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.