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

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

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

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

答案1

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

答案2

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

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

在其他外壳中:

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的扩展{})。

答案3

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

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

答案4

-exec‍也 :

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

相关内容