我在几个目录中有一堆.zip文件:
Fol1/Fol2
Fol3
Fol4/Fol5
我该如何将它们全部移到一个公共基本文件夹中?
我在几个目录中有一堆.zip文件:
Fol1/Fol2
Fol3
Fol4/Fol5
我该如何将它们全部移到一个公共基本文件夹中?
Answers:
转到包含zip文件(cd …
)的树的顶级目录,然后运行
mv **/*.zip /path/to/single/target/directory
这在zsh中是开箱即用的。如果您的shell是bash,则需要首先运行shopt -s globstar
(您可以并且应该将此命令放入~/.bashrc
)。如果您的shell是ksh,则需要先运行set -o globstar
(将其放入~/.kshrc
)。
另外,可以使用use find
,它无需特殊准备即可在任何地方使用,但更为复杂:
find . -name '*.zip' -exec mv {} /path/to/single/target/directory \;
如果以后要删除空目录,请在zsh中:
rmdir **/*(/^Fod)
在bash或ksh中:
rmdir **/*/
并重复此操作,直到有空目录要删除。或者,在任何外壳中
find . -depth -type d -empty -exec rmdir {} \;
find
上面的第一个命令在bash中起作用,但是必须更改为find . -name
etc才能使其起作用。
.
对于GNU find是隐式的,但对于其他人则不是,我已将其显式添加。
当移动数据且无错误时,这是安全的,无论版本如何,它都支持大多数发行版。此命令将扫描子目录,然后移动或复制到新的目标目录。
find . -name *.flac -exec mv '{}' "./flac/" ";"
*.flac
为类似*.zip
您的情况的任何内容。或者*.doc
只是任何扩展名都可以。mv
是移动文件的命令,也可以使用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文件。
;
办?
作为bash hack,您可以使用以下功能tar
:
(cd origin/;find . -exec file --mime-type "{}" \;|grep "application/zip"|cut -d ':' -f 1|xargs tar cf -)|(cd target/; tar xf -) && rm -fr origin/
这样做的优点是它不依赖于文件扩展名,因为它使用file
命令选择要移动的文件,并且保留了目录结构,但是不适用于包含空格的路径。
最后rm
就是删除原始文件(因为@InquilineKea告诉他他不在乎注释中的原始文件夹)。
当然,如果原始文件夹和目标文件夹位于不同的磁盘上,则这特别适合。否则,提出的其他解决方案将更加高效(即使它们依赖于命名约定而不是file
内容)。