フォルダの内容を一覧表示し、次の形式で出力する方法を探しています。
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=C
print
バイト値のみでソートするように設定されている-o
(ロケールソート順序ではありません)print -orC1
:print
、ああ、列にo
注文しました。r
1
C
**/*
:再帰的ワイルドカード(NDoN^-/)
N
otglob(ファイルがない場合は空になるように拡張)、D
otglob(隠しファイルを含む)を含むソート修飾子は、otordered asoN
と共に使用され、何らかの方法でソートされます。ファイルタイプの除外N
o
print
^-/
目次(シンボリックリンク確認後に決定)
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
順序の代わりにソート順序(たとえば、またはを使用しますsort
がgit 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-maybe
C
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
、常に内容全体をパイプして同じ出力を得ることができます。\
\
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
\