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


30

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

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

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

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

mv: cannot overwrite non-directory `/thisdir/*.ogg' with directory `/somedir'

Answers:


23

您可以为此使用find和xargs

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 \;


1
请不要忘记在尝试上述命令之前进行备份:-)。
Hemant 2010年

2
顺便说一句,对于find的第一个-print0和xargs的-0应该尽可能使用,以避免文件名中出现空格。
maxschlepzig's

@maxschlepzig:好点。我会编辑。
Hemant 2010年

2
我强烈建议mv -i在这里使用,这样一来,如果发生意外情况,您就不会冒险覆盖文件。
吉尔(Gilles)“所以,别再邪恶了”,2010年

2
通过gnu core utils中的mv,您可以使用mv -t <targetdir>and +代替\;

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

您有点把mv的论调互换了


9

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

mv /thisdir/**/*.ogg /somedir

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

rsync -a --prune-empty-dirs --include='*/' --include='*.ogg' --exclude='*' /thisdir /somedir

在bash中不方便
马克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.