2010-01-07 25 views
4

find ./dir -type f -iname "*.t[argz]*[bz2]" -print | xargs mv --target-directory=dir 似乎在名稱中有空格的文件上失敗。 如何改進?或替代?在Linux上用recipesively移動文件

感謝下面的回答:我的MV不支持--null或-0,我用的cygwin:

 
$ mv --help 
Usage: mv [OPTION]... [-T] SOURCE DEST 
    or: mv [OPTION]... SOURCE... DIRECTORY 
    or: mv [OPTION]... -t DIRECTORY SOURCE... 
Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY. 

Mandatory arguments t 
. 

回答

7

使用-print0而不是-printfind命令和xargs的-0(或--null)選項 - 則NUL將用作分隔符而不是換行符和空格。

find ./dir -type f -iname "*.t[argz]*[bz2]" -print0 | xargs --null mv --target-directory=dir 
+0

$找到./型的F -iname 「* .xls的」 -print0 | xargs mv --null --target-directory = x ls xargs:警告:輸入中出現NUL字符。它不能在參數列表中通過thr ugh。你的意思是使用--null選項嗎? mv:無法識別的選項'--null' 嘗試'mv --help'以獲取更多信息。 – user217631

+0

對不起 - 應該是一個xargs選項,而不是mv選項!固定。 –

0

你看了看-exec選項嗎?

find ./dir -type f -iname "*.t[argz][bz2]" -exec mv {} --target-directory=dir ';' 

-exec選項將執行它後面的任何選項作爲命令,直到它看到包含引號的分號。這樣你就不必處理間距問題。

+1

儘管如此,xargs變體將數百個文件分配到同一個命令行上,這爲每個文件都產生了一個子進程。對於像單個mv調用這樣的小型操作,這可能是一個顯着的性能差異。儘管你必須使用-print0和--null,正如martin指出的那樣,除非你確定文件名沒有空格。 –

0

GNU找到

find ./dir -type f -iname "*.t[argz]*[bz2]" -exec mv "{}" /destination +;