Shell-Script

遍歷目錄中內容的正確方法

  • October 10, 2017

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

for file in `ls -a`; do

但是,迭代不是ls一個好主意,因為文件名中的空格會搞亂一切。遍歷目錄並獲取所有隱藏文件的正確方法是什麼?

您只需要創建一個 glob 匹配文件列表,用空格分隔:

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 以將點文件與 pure 匹配*

shopt -s dotglob

zsh一個需要額外設置nullglob以防止在不匹配的情況下出現錯誤:

setopt nullglob

或者,或者將 glob 限定符添加N到模式中:

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

引用自:https://unix.stackexchange.com/questions/162586