2012-01-02 21 views
2

所以基本上,我有一個文件夾,其中有一堆子文件夾,其中有超過100個文件。我想把所有的mp3文件(真正的通用擴展名,因爲我必須用JPG等來完成),並將它們移動到原始目錄中的新文件夾中。所以基本上的文件結構如下所示:在子目錄中移動多個文件(和/或通過multichar分隔符分割字符串)[bash]

/.../dir/recup1/file1.mp3

/.../dir/recup2/file2.mp3

...等

,我希望它看起來像這樣:

/.../dir/music/file1.mp3

/.../dir/music/file2.mp3

...等

我想我會使用沿着這些路線看上去bash腳本:

#!/bin/bash 
STR=`find ./ -type f -name \*.mp3` 

FILES=(echo $STR | tr ".mp3 " "\n") 

for x in $FILES 
do 
    echo "> [$x]" 
done 

我只是現在回聲,但最終我會想用mv將其送到正確的文件夾。顯然,這不起作用,因爲tr會將每個角色看作分隔符,所以如果你們有更好的主意,我會很感激。

(僅供參考,我正在上網本的Ubuntu,所以如果有一個GUI的方式類似於Windows的搜索,我也不會反對使用它)

回答

1

如果再music文件夾中存在以下應該工作 -

find /path/to/search -type f -iname "*.mp3" -exec mv {} path/to/music \; 

A -exec command必須以;(因此您通常需要鍵入\;或​​3210以避免shell的解釋)或+。與;不同的是,該命令在每個文件中被調用一次,其中+被調用的次數儘可能少(通常只有一次,但命令行有最大長度,因此可能會被分割)所有文件名。

+0

最後的'\;'是什麼?編輯:沒關係,下面的人回答它。 – 2012-01-02 22:27:11

+0

更新瞭解釋的答案。希望有所幫助! – 2012-01-02 22:45:44

+2

你可以用'+'代替'\;',它會快得多。大多數現代的'find'實現都支持它。 – 2012-01-02 22:53:43

0

你可以這樣說:

find /some/dir -type f -iname '*.mp3' -exec mv \{\} /where/to/move/ \; 

\{\}部分將被找到的文件名/路徑替換。 \;部分設置爲-exec部分的結束,它不能被忽略。

如果要打印的內容被發現,只需添加一個-print標誌,如:

find /some/dir -type f -iname '*.mp3' -print -exec mv \{\} /where/to/move/ \; 

HTH

相關問題