迭代目錄中內容的正確方法

迭代目錄中內容的正確方法

我需要遍歷目錄中的每個檔案。我看到的常見方法是使用以 開頭的 for 迴圈for file in *; do。但是,我意識到它不包括隱藏文件(以“.”開頭的文件)。另一個明顯的方法是然後做類似的事情

for file in `ls -a`; do

然而,迭代ls是一個壞主意,因為檔案名稱中的空格會把一切搞亂。迭代目錄並獲取所有隱藏檔案的正確方法是什麼?

答案1

您只需要建立一個全域匹配文件的列表,用空格分隔:

for file in .* *; do echo "$file"; done

編輯

上面的可以使用大括號擴展以不同的形式重寫

 for file in {.*,*}; do echo "$file"; done

甚至更短:for file in {.,}*; do echo "$file"; done

新增所選檔案的路徑:

 for file in /path/{..?,.[!.],}*; do echo "$file"; done

新增所選檔案的路徑:

 for file in /path/{.,}*; do echo "$file"; done

如果您想變得複雜並從列表中刪除通常不需要的內容...只需更改{.,}*{..?,.[!.],}*.

為了完整起見,值得一提的是,還可以設定 dotglob 以將點文件與純*.

shopt -s dotglob

需要zsh另外設定nullglob以防止在不匹配的情況下出現錯誤:

setopt nullglob

或者,也可以將 glob 限定詞加入N到模式中:

for file in /path/{.,}*(N); do echo "$file"; done

相關內容