
我需要遍歷目錄中的每個檔案。我看到的常見方法是使用以 開頭的 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