如何按类型递归地将文件从目录及其子目录移动到另一个目录?

Ste*_*ine 37 command-line directory find rename

从目录及其所有子目录中移动文件类型的好方法是什么?

就像“将 /thisdir 中的所有 *.ogg 递归移动到 /somedir”。我尝试了几件事;我最大的努力是(仍然不是那么好):

find /thisdir -type f -name '*.ogg' -exec mv /somedir {} \;
Run Code Online (Sandbox Code Playgroud)

它在每个文件名之前的每一行返回,

mv: cannot overwrite non-directory `/thisdir/*.ogg' with directory `/somedir'
Run Code Online (Sandbox Code Playgroud)

Hem*_*ant 32

您可以为此使用带有xargs 的 find

find /thisdir -type f -name "*.ogg" -print0 | xargs -0 -Imysongs mv -i mysongs /somedir

上面命令中的 -I 告诉 xargs 你想使用什么替换字符串(否则它会将参数添加到命令的末尾)。


在您的命令中,只需尝试在mv命令后移动“{}” 。

find /thisdir -type f -name '*.ogg' -exec mv -i {} /somedir \;

  • 顺便说一句,对于第一个 -print0 for find 和 -0 for xargs 应该尽可能使用,以避免文件名问题中的空格。 (2认同)
  • 我强烈建议在这里使用 `mv -i`,这样你就不会在发生意外情况时冒覆盖文件的风险。 (2认同)
  • 使用来自 gnu 核心工具的 mv,您可以使用 `mv -t <targetdir>` 和 + 代替 \; (2认同)

Gil*_*il' 16

在 zsh 或 bash 4 中,将所有*.ogg文件收集到/somedir

mv /thisdir/**/*.ogg /somedir
Run Code Online (Sandbox Code Playgroud)

如果要重现目录层次结构:(警告,直接在浏览器中输入)

rsync -a --prune-empty-dirs --include='*/' --include='*.ogg' --exclude='*' /thisdir /somedir
Run Code Online (Sandbox Code Playgroud)


Cod*_*ict 14

find /thisdir -type f -name "*.ogg" -exec mv {} /somedir \;
Run Code Online (Sandbox Code Playgroud)

你有点交换了 mv 的参数

  • 警告!!!这不会将递归文件夹结构保留在目的地! (2认同)