ls 的格式輸出
我正在尋找一種方法來列出文件夾中的內容,並以這種格式輸出:
folder/file.txt
類似於 git 命令的輸出:
git ls-tree -r --name-only
有什麼建議麼?
git ls-tree -r --name-only
似乎遞歸地列出了所有文件,包括隱藏文件,但不包括目錄類型的文件,使用strcmp()
作為排序比較函式按名稱排序。因此,要列出目錄的內容而不是
git
儲存庫修訂版中的文件列表,zsh
您可以這樣做:LC_ALL=C print -orC1 -- **/*(NDoN^-/)
那是:
LC_ALL=C
僅設置-o
按字節值排序(而不是區域設置排序順序)print -orC1
:o
rdered,r
aw on olumn1
C
。**/*
: 遞歸萬用字元(NDoN^-/)
排序限定符,包括N
ullglob(在沒有文件時擴展為空)、D
otglob(包括隱藏文件),oN
因為N
oto
rdered^-/
排除目錄類型的文件(在符號連結解析後確定)。使用 GNU 工具,您可以獲得與以下內容等效的東西:
find . ! -xtype d -printf '%P\0' | LC_ALL=C sort -z | tr '\0' '\n'
! -xtype d
: 排除目錄和目錄的符號連結。-printf '%P\0'
列印以NUL 分隔的(即沒有前綴)內的路徑。.``./
LC_ALL=C sort -z
按字節值而不是區域設置排序順序對該列表進行排序。tr '\0' '\n'
:將 NUL 轉換為換行符,以便人類使用者可以閱讀列表(儘管我們不再知道每個文件名(可能由幾行組成)的開始和停止位置)。要排除隱藏文件,請更改為:
LC_ALL=C print -orC1 -- **/*(NoN^-/)
如果您不介意獲取排序順序(例如
ls
orsort
,但git ls-tree
預設情況下不這樣做)而不是strcmp()
順序,您可以簡化它:print -rC1 -- **/*(N^-/)
(因為這是 glob 的預設順序)。
或者使用 GNU
tools
:LC_ALL=C find . -name '.?*' -prune -o ! -xtype d -printf '%P\0' | sort -z | tr '\0' '\n'
LC_ALL=C
需要find
它.?*
來匹配所有隱藏文件,即使是那些包含在您的語言環境中不形成有效字元的字節值的文件。
git ls-tree
然而,編碼包含非 ascii 字元的文件名(受core.quotePath
配置設置的影響,預設情況下可以設置每個儲存庫的基礎true
)或控製字元或\
C"
樣式字元串(例如"foo\"bar\nbaz"
)。要執行類似的操作,您可以ls --quoting-style=c-maybe
在C
語言環境中使用 GNU:
zsh
使用 GNUls
:print -rNC1 -- **/*(N^-/) | LC_ALL=C xargs -r0 ls --quoting-style=c-maybe -1dU --
GNU 工具:
LC_ALL=C find . -name '.?*' -prune -o ! -xtype d -printf '%P\0' | sort -z | LC_ALL=C xargs -r0 ls --quoting-style=c-maybe -1dU --
請注意,
ls
輸出一個名為\
as的文件,\
而git ls-tree
將其輸出為"\\"
. 如果你真的在乎,你總是可以通過管道將整個事情傳遞sed -e '/^"/b' -e '/\\/!b' -e 's/\\/&&/g' -e 's/.*/"&"/'
給以獲得相同的輸出。
zsh``:q
如果您在其 glob 限定符中使用修飾符,則可以為您提供不同的引用風格。一個git
帶有奇怪文件名的儲存庫的範例:$ ls -AFq ''$'\351' ''$'\n' '"' '\' a 'a'$'\n''b' B é .git/ 'my dir'/ ''$'\b' ' ' "'" '~' A b dir/ .foo link@
$ git ls-tree -r --name-only HEAD "\b" "\n" "\"" ' .foo A B "\\" a "a\nb" b link my dir/file ~ "\303\251" "\351"
$ print -rC1 -- **/*(N^-/:q) \ \" \' \\ \~ $'\351' $'\b' $'\n' a A a$'\n'b b B é link my\ dir/file
$ LC_ALL=C find . -name '.?*' -prune -o ! -xtype d -printf '%P\0' | pipe> sort -z | pipe pipe> LC_ALL=C xargs -r0 ls --quoting-style=c-maybe -1dU -- "\351" "\b" "\n" "\"" ' \ ~ a A "a\nb" b B "\303\251" link my dir/file
(請注意缺少(儘管它在儲存庫中
.foo
並由YMMV 在您自己的語言環境中))。git ls-tree``.git``git``\