Shell-Script
遍歷目錄中內容的正確方法
我需要遍歷目錄中的每個文件。我看到的一種常見方式是使用以 . 開頭的 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