2013-05-09 110 views
2

說我有一個無組織的目錄中有數以千計的文件,其名稱中有前綴,如abc-tab,abc-vib,h12-123,h12-498 ....如何將具有相同前綴的文件移動到他們自己的目錄中?Linux找到具有相似名稱的文件,並移動到新目錄

我想使用類似

find . -path '*/support/*abc*' -exec mv "{}" /new/abc\; 

但這意味着我將不得不重新鍵入該命令對每個前綴。

回答

4

抓住所有前綴lsuniq以獲得單個列表,然後使用for循環移動文件。

for F in $(ls | cut -d- -f1 | uniq); do 
    mkdir "${F}" && mv "${F}"-* "${F}" 
done 

很多人從Advanced Bash Scripting Guide學習shell腳本。查看cutuniq手冊頁,瞭解有關這些程序的詳細信息。

+0

如果我想搬到新創建的文件夾,驅動器Z這將是這樣的: 適用於F在$(LS |切-D- - f1 | uniq);做 mkdir「$ {F}」&& mv「$ {F}」 - *「$ {/ z/F}」 done – user2189312 2013-05-09 21:10:25

+0

您使用的是cygwin嗎?然後你將第二行改爲'mkdir/cygdrive/z /「$ {F}」&& mv「$ {F}」 - */cygdrive/z /「$ {F}」'。 – andrewdotn 2013-05-09 21:16:09

+0

我正在使用gnome – user2189312 2013-05-09 21:31:54

0

如果命令基本上沒有你想你可以簡單地環繞它的腳本是什麼:

for i in abc h12 something_else 
do 
    find . -path \*/support/\*${i}\* -exec mv "{}" /new/${i} + 
done 
1

我會使用一個for循環,在每個文件名的每個實例運行。

從包含該文件的目錄中:

mkdir newfolder 

    for i in prefix_* 
    do 
     cp $i newfolder/$i 
    done 

然後我會檢查正確的文件複製過來,如果是這樣運行

rm prefix_* 

更危險的方法是運行

mkdir newfolder 

    for i in prefix_* 
    do 
     mv $i newfolder/$i 
    done 

但mv會自動刪除源文件,並且我喜歡確保c在此之前發生的直接行爲。

0

事情是這樣的腳本應該爲你工作:

while read l 
do 
    prefix=${l%-*} 
    mv "$l" "/new/$prefix" 
done < <(find '*/support/') 
相關問題