2017-04-17 66 views
0

在腳本所在的位置,我有多個子目錄,我想在其中對所有內容運行單個命令。內容也按升序編號。在具有10個以上項目的文件夾中使用for f in *會導致在1..9之前順序出現名爲1011的文件。按數字順序處理文件

此外,每個子目錄中的文件數量在6到12個項目之間不等,所以我不認爲我可以簡單地執行像{1..12}這樣的範圍操作,因爲我想避免關於不存在的文件的警告/錯誤。

問題:有沒有辦法強制或修改for循環遍歷文件夾中的所有內容不知道的文件夾內容的數量時保持遞增順序?

term=""     # hold accumulated filenames 

for d in */ ; do   # iterate over sub-directories 
    cd $d 
    for f in * ; do  # iterate over files in sub-directory 
     term="$term $f" 
    done 
    # run a command using the string $term 
    term="" 
    cd .. 
done 

邊注:我標記shshellbash因爲他們都適用於這個問題。在添加兩個標記之前,我閱讀Difference between sh and bash,以確保它是一個有效的選擇,即使存在一些語法/可移植性的變化等。

回答

1

爲此,您可以使用ls選件-v。從man ls

-v natural sort of (version) numbers within text

如果從ls改變你的內循環,以

for f in `ls -v` ; do  # iterate over files in sub-directory 
    term="$term $f" 
done 

結果進行排序數字升序進行排序。

另一種選擇是sort,從man sort

-g, --general-numeric-sort compare according to general numerical value

配管從ls結果通過sort -g給出相同的結果。

編輯

因爲使用的ls輸出來獲得文件名is a bad idea,還可以考慮使用替代find,例如

for f in `find * -type f | sort -g`; do 
    ... 
+0

感謝@resc示例,它有幫助。 –