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

qod*_*nja 24 grep file-copy rename

我还不是很熟悉grep/find/awk/xargs相当的所有技巧。

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

Kev*_*vin 23

mkdir ~/dst
find source -name "*.xxx" -exec mv -i {} -t ~/dst \;
Run Code Online (Sandbox Code Playgroud)


Gil*_*il' 18

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

mkdir ~/new-directory
mv -i **/*.xxx ~/new-directory
Run Code Online (Sandbox Code Playgroud)

在其他外壳中:

mkdir ~/new-directory
find . -name '*.xxx' -exec mv -i {} ~/new-directory \;
Run Code Online (Sandbox Code Playgroud)

如何阅读此find命令:

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

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

find . -name '*.xxx' -exec sh -c 'mv -i "$@" "$0"' ~/new-directory {} +
Run Code Online (Sandbox Code Playgroud)

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