2013-04-27 51 views
0

我有大約1000個文件(png),需要將它們移動到相應的目錄及其子目錄中。Bash:讀取文件並移入子目錄

我確實有26個目錄(A - Z),每個目錄下面還有完整的字母表A-Z。文件名長度爲6個字符/數字,並有一個png擴展名,例如例如AH2BC0.png

我需要將文件AH2BC0.png移動到目錄A中,並在該目錄內移動到子目錄H中,例如A-> H-> AH2BC0.png。

我創建了以下腳本,它是不是真的如預期工作:

#!/bin/bash 
ls >LISTE.txt 
for i in LISTE.txt; do 
a=$(cat $i | cut -b 1 | tr '[:lower:]' '[:upper:]') 
b=$(cat $i | cut -b 2 | tr '[:lower:]' '[:upper:]') 
mkdir -p $a/$b 
cat $i | xargs mv $a/$b 
rm $i 
done 

問題是)則不會創建子目錄和b)的文件不會移動。對腳本有任何建議或更好的想法?

感謝

PS:我想這是顯而易見的,它相當長的一段年前就是我創建的任何的bash腳本或編碼,所以請多多包涵。 PSS:在Mac OSX上的bash工作3.2

回答

3

有已經顯示出更好的方案做你想做什麼職位,但我想我會告訴你如何解決你的。希望你會發現它的信息。

#!/bin/bash 
ls >LISTE.txt 
for i in LISTE.txt; do 

這個循環遍歷單個值LISTE.txt;將其替換爲:文件的

for i in $(cat LISTE.txt); do 

地遍歷內容來代替。

a=$(cat $i | cut -b 1 | tr '[:lower:]' '[:upper:]') 
    b=$(cat $i | cut -b 2 | tr '[:lower:]' '[:upper:]') 

你想用echo,而不是cat在上述兩行,因爲你是名稱的文件不是其內容的後。

mkdir -p $a/$b 
    cat $i | xargs mv $a/$b 

我不認爲上面這行做什麼你認爲它...它會試圖重命名$ A/$ B目錄C,其中C是文件$ i的內容 。其替換爲:

mv $i $a/$b 

不需要

以下行:

rm $i 

所以,簡單地將其刪除。只有在複製而不是使用mv移動文件時纔有必要。

done 

這是我建議的更改後的完整程序。

#!/bin/bash 
ls >LISTE.txt 
for i in $(cat LISTE.txt); do 
    a=$(echo $i | cut -b 1 | tr '[:lower:]' '[:upper:]') 
    b=$(echo $i | cut -b 2 | tr '[:lower:]' '[:upper:]') 
    mkdir -p $a/$b 
    mv $i $a/$b 
done 
+0

非常感謝!這絕對是信息,我很驚訝我犯了多少錯誤。 – AtaDas 2013-04-27 21:28:05

+0

如果你喜歡我的回答,我會歡迎upvote :-) – 2013-04-27 21:30:39

+1

想upvote,但不能。我確實得到了我需要15點聲望才能做到的信息。抱歉。 – AtaDas 2013-04-27 21:45:37

3
#!/bin/bash 
for item in *; do 
    first=${item:0:1} 
    second=${item:1:1} 

    folder="$first/$second" 
    mkdir -p $folder 
    mv $item $folder/ 
done 
+0

也適用於只有一個錯誤。第二個目錄名稱確實開始兩位數字而不是一個。不過,也非常感謝。 – AtaDas 2013-04-27 21:43:25

+0

固定的'second = $ {item:1:2}'應該是'second = $ {item:1:1}' – 2013-04-27 21:48:31

+0

是的,有效。乾杯。 – AtaDas 2013-04-27 21:49:52

相關問題