說我有一個無組織的目錄中有數以千計的文件,其名稱中有前綴,如abc-tab,abc-vib,h12-123,h12-498 ....如何將具有相同前綴的文件移動到他們自己的目錄中?Linux找到具有相似名稱的文件,並移動到新目錄
我想使用類似
find . -path '*/support/*abc*' -exec mv "{}" /new/abc\;
但這意味着我將不得不重新鍵入該命令對每個前綴。
說我有一個無組織的目錄中有數以千計的文件,其名稱中有前綴,如abc-tab,abc-vib,h12-123,h12-498 ....如何將具有相同前綴的文件移動到他們自己的目錄中?Linux找到具有相似名稱的文件,並移動到新目錄
我想使用類似
find . -path '*/support/*abc*' -exec mv "{}" /new/abc\;
但這意味着我將不得不重新鍵入該命令對每個前綴。
抓住所有前綴ls
和uniq
以獲得單個列表,然後使用for循環移動文件。
for F in $(ls | cut -d- -f1 | uniq); do
mkdir "${F}" && mv "${F}"-* "${F}"
done
很多人從Advanced Bash Scripting Guide學習shell腳本。查看cut
和uniq
手冊頁,瞭解有關這些程序的詳細信息。
如果命令基本上沒有你想你可以簡單地環繞它的腳本是什麼:
for i in abc h12 something_else
do
find . -path \*/support/\*${i}\* -exec mv "{}" /new/${i} +
done
我會使用一個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在此之前發生的直接行爲。
事情是這樣的腳本應該爲你工作:
while read l
do
prefix=${l%-*}
mv "$l" "/new/$prefix"
done < <(find '*/support/')
如果我想搬到新創建的文件夾,驅動器Z這將是這樣的: 適用於F在$(LS |切-D- - f1 | uniq);做 mkdir「$ {F}」&& mv「$ {F}」 - *「$ {/ z/F}」 done – user2189312 2013-05-09 21:10:25
您使用的是cygwin嗎?然後你將第二行改爲'mkdir/cygdrive/z /「$ {F}」&& mv「$ {F}」 - */cygdrive/z /「$ {F}」'。 – andrewdotn 2013-05-09 21:16:09
我正在使用gnome – user2189312 2013-05-09 21:31:54