2016-11-08 61 views
0

我正在嘗試編寫一個腳本,該腳本將所有帶有路徑的文件名加載到bash腳本中的數組中。Bash腳本將目錄/子目錄中的所有文件加載到數組中

說我想在/ home/documents /中的所有文件夾和子文件夾的文件,它會給我最後的文件數組。

我目前的腳本是非常基本的,但應該有一些功能。

num_partitions=0 
for file in /home/documents/*; do 
    date_partition[$num_partitions]=${file##*/} 
    ((num_partitions++)) 
    echo ${date_partition} 
done 

目前它只打印黑屏。我如何修復它以獲得我需要的功能並正確地打印我們的?

我是新來的Bash,這實際上是我的第一個腳本。請幫忙。

回答

1

首先,通常,你不想來解析LS的輸出... http://mywiki.wooledge.org/ParsingLs

接下來,你的做法的邏輯是沒有錯的。有一個更簡單的方法,我們可以用它來完成這個任務!

ar=($(find /home/documents/*)); echo "${#ar[@]}"; echo "${ar[2]}" 

打破它我們有。

$(find /home/documents/*) 

這是一個命令替換。它捕獲寫入其中的命令的輸出。有了這個,你可以做類似output=$(find .)的事情,現在輸出是一個包含find命令結果的變量。

接下來我們

ar=() 

()創建一個數組。這個數組的輸入現在將成爲find命令的輸出。所以當我們把它們放在一起時,我們最終得到了「從這個find命令的輸出中創建一個數組」。

其餘的命令只是顯示ar實際上是一個數組。我們打印出陣列的長度,然後索引值爲2.

建議使用Google搜索命令替換bash中的命令。從bash中的命令創建一個數組。如何在bash中使用數組。

注意:意識到$()內的命令可以包含|到其他命令,如find . | tr -d "." | ./some_other_command。此外,我建議閱讀自從「查找」的手冊頁。「和「..」可能會出現在您的數組中,因爲它現在寫入。

+1

更簡單:'arr =(/ home/documents/*)' - 這會將文件名模式擴展到數組中。對於包含空格的文件名,這比'$(find ...)'安全。 –

+0

好點。我非常習慣於不需要處理其中有空格的文件。然而,問題仍然是,如果不需要的話,沒有理由使用額外的工具。 –

相關問題