Linux

ls 遞歸,顯示完整路徑

  • April 27, 2021

顯然有很多方法可以在 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

bashshell 可以通過其特殊的通配模式遞歸到目錄中****模式匹配 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 ./**,它這樣做是為了創建lsbefore的參數列表ls甚至被呼叫。

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