将多个子目录中具有特定扩展名的所有文件移动到一个目录中

将多个子目录中具有特定扩展名的所有文件移动到一个目录中

我在几个目录中有一堆 .zip 文件:

Fol1/Fol2
Fol3
Fol4/Fol5

我如何将它们全部移动到一个公共基本文件夹?

答案1

转到包含 zip 文件的树的顶层目录 ( cd …),然后运行

mv **/*.zip /path/to/single/target/directory/

这在 zsh 中是开箱即用的。如果您的 shell 是 bash,则需要shopt -s globstar先运行(您可以而且应该将此命令放在您的 中~/.bashrc)。如果您的 shell 是 ksh,则需要set -o globstar先运行(将其放入您的~/.kshrc)。

或者,使用find,它可以在任何地方使用,无需特殊准备,但更复杂:

find . -name '*.zip' -exec mv {} /path/to/single/target/directory/ \;

如果您想随后删除空目录,请在 zsh 中:

rmdir **/*(/^Fod)

在 bash 或 ksh 中:

rmdir **/*/

并重复,只要有空目录需要删除。或者,在任何 shell 中

find . -depth -type d -empty -exec rmdir {} \;

答案2

如果您只想移动文件.zip,您可以执行类似的操作

mkdir ./zipfiles
find . -name "*.zip" -exec mv "{}" ./zipfiles \;

答案3

这在移动数据时是安全的并且无错误,支持大多数发行版,无论版本如何。此命令将扫描子目录,然后移动或复制到新的目标目录。

find . -name *.flac -exec mv '{}' "./flac/" ";"
  • 在包含包含您要移动的文件的子目录的主目录中运行此命令。
  • 您可以在其中更改为与您的情况*.flac类似的任何内容。*.zip或者*.doc任何扩展都可以。
  • andmv是移动文件的命令,或者您可以使用cp复制数据而不是移动。
  • ./flac/是我要将所有 FLAC 文件移动到的目标目录。您还可以给它一个完整的路径,例如/home/myid/flac/

完整的例子。 (在这种情况下,有许多带有音乐艺术家姓名的子目录/home/myid/Music/,然后 FLAC 文件位于不同的子目录级别。因为我不需要艺术家文件夹,但希望将所有 FLAC 文件放入一个目录中/home/myid/Music/flac/

cd /home/myid/Music
mkdir flac
find . -name *.flac -exec mv '{}' "./flac/" ";"
cd flac
ls

然后它将显示所有 FLAC 文件。

答案4

假设您有 GNU 版本的 find 和 mv,以下内容将比现有的基于 find 的答案更有效:

find . -name '*.zip' -exec mv --target-directory='/path/to/outputdir' '{}' +

+在 find -exec 末尾使用 a意味着文件列表将传递给 mv 命令,而不是对每个找到的文件执行一个 mv 命令。然而,这样做的一个限制是你只能将“{}”放在命令的末尾,这需要使用 mv --target-directory 选项,据我所知这是一个 GNU 主义。

相关内容