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 -orC1: print, 오, 열에 o주문했습니다 .r1 C
  • **/*: 재귀적 와일드카드
  • (NDoN^-/)Notglob(파일이 없을 때 비어 있도록 확장), Dotglob(숨겨진 파일 포함)을 포함한 정렬 한정자는 otordered as oN와 함께 사용되어 어떤 방식으로든 정렬됩니다. 파일 유형 제외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순서 대신 정렬 순서(예: 또는 를 사용 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-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\

관련 정보