폴더의 내용을 나열하고 다음 형식으로 출력하는 방법을 찾고 있습니다.
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
\