Linux
ls 遞歸,顯示完整路徑
顯然有很多方法可以在 Linux 中完成相同的工作,但我最近需要
for i in xxx
遍歷每個項目的列表,在樹中遞歸。tree
我通過做tree -fail
(或只是為了獲取目錄名稱)找到了一個解決方案tree -faild
,但這讓我想知道:是否有可能通過使用來獲得這樣的列表ls
?$ tree -fail . ./.custom ./custom_loader.sh ./.git ./.git/branches ./.git/COMMIT_EDITMSG ./.git/config ./.git/description ./.git/HEAD ./.git/hooks ./.git/hooks/applypatch-msg.sample
bash
shell 可以通過其特殊的通配模式遞歸到目錄中**
。**
模式匹配 like ,*
但也跨越/
路徑名:shopt -s globstar nullglob dotglob for dirpath in ./**/; do printf '%s\n' "$dirpath" # whatever other code needs to be run on "$dirpath" done
我
globstar
可以訪問,如果模式不匹配任何內容,**
我也可以完全跳過循環,nullglob
並且還可以查看隱藏文件。dotglob
該模式
./**/
將匹配目前目錄中或之下的任何目錄,就像./*/
匹配目前目錄中的任何目錄一樣。使用
./**/*
或./**
列出所有類型的文件。您也可以通過以下方式便攜地執行此操作
find
:find . -type d -exec sh -c ' for dirpath do printf "%s\n" "$dirpath" # whatever other code needs to be run on "$dirpath" done' sh {} +
在這裡,為腳本
find
中的循環sh -c
提供目錄的路徑名。執行這兩個範例時您將看到的唯一區別是第一個範例(
bash
帶有 的循環**
)將解析到目錄的符號連結,而find
不會解析到目錄的符號連結。如果您只想列出目錄,那麼
find
範例可能會顯著縮短為find . -type d -print
使用
-type f
代替-type d
只查看正常文件,-type
完全刪除測試查看所有類型的文件。您顯然也可以使用
ls
來獲取這樣的列表,但我並沒有真正看到它有什麼意義,因為除了查看輸出之外,您什麼也做不ls
了。shopt -s globstar dotglob ls -1d ./**
請注意,如果模式擴展為的路徑名列表太長,則此命令可能會觸發“參數列表太長”錯誤。此答案中的其他命令都沒有這個問題。
另請注意,這裡實際上
ls
並沒有進行任何遞歸,它是擴展遞歸模式的 shell./**
,它這樣做是為了創建ls
before的參數列表ls
甚至被呼叫。