lsのフォーマットされた出力

lsのフォーマットされた出力

フォルダの内容を一覧表示し、次の形式で出力する方法を探しています。

folder/file.txt

gitコマンドの出力に似ています。

git ls-tree -r --name-only

どんな提案がありますか?

ベストアンサー1

git ls-tree -r --name-only隠しファイルを含むすべてのファイルを再帰的にリストしますが、そのタイプのファイルはリストされていないようです。目次、名前でソートされ、strcmp()ソート比較機能として使用されます。

gitしたがって、リポジトリリビジョンのファイルリストではなく、ディレクトリの内容を一覧表示するのと同様のものを取得するには、zsh次のようにします。

LC_ALL=C print -orC1 -- **/*(NDoN^-/)

それは:

  • LC_ALL=Cprintバイト値のみでソートするように設定されている-o(ロケールソート順序ではありません)
  • print -orC1print、ああ、列にo注文しました。r1 C
  • **/*:再帰的ワイルドカード
  • (NDoN^-/)Notglob(ファイルがない場合は空になるように拡張)、Dotglob(隠しファイルを含む)を含むソート修飾子は、otordered asoNと共に使用され、何らかの方法でソートされます。ファイルタイプの除外Noprint^-/目次(シンボリックリンク確認後に決定)

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順序の代わりにソート順序(たとえば、またはを使用しますsortgit ls-tree、デフォルトではそうではありません)を使用してもかまいませんstrcmp()

print -rC1 -- **/*(N^-/)

(これは地球の基本的な順序だからです。)

または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スタイル文字列(たとえば)\を含むファイル名はエンコードされます。同様の操作を行うには、ロケールでGNUを使用できます。""foo\"bar\nbaz"ls --quoting-style=c-maybeC

zshGNUを使用すると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、常に内容全体をパイプして同じ出力を得ることができます。\\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(ストアにあり、 とリストされているにもかかわらずgit ls-tree)、(ストアは単にメタデータを保存する場所.gitなのでリポジトリにはありません)、ファイルエンコーディングの違い、並び替え順序の違い(特に小文字と大文字に関するもの)に注目してください。 、独自のロケールとしてYMMV))。git\

おすすめ記事