Ls

ls 的格式輸出

  • November 18, 2020

我正在尋找一種方法來列出文件夾中的內容,並以這種格式輸出:

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僅設置print為其-o按字節值排序(而不是區域設置排序順序)
  • print -orC1: print, ordered, raw on olumn 1 C
  • **/*: 遞歸萬用字元
  • (NDoN^-/)排序限定符,包括Nullglob(在沒有文件時擴展為空)、Dotglob(包括隱藏文件),oN因為Not orderedprint會以任何方式對它們進行排序。^-/排除目錄類型的文件(在符號連結解析後確定)。

使用 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^-/)

如果您不介意獲取排序順序(例如lsor sort,但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-maybeC語言環境中使用 GNU:

zsh使用 GNU ls

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``\

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