ls -l 출력을 파이프로 구분된 파일 형식으로 지정

ls -l 출력을 파이프로 구분된 파일 형식으로 지정

저는 Unix를 처음 접했고 도움이 필요합니다. ls -l명령을 실행하고 (실제로 ls -alR는) 출력을 파일로 파이프하면 반환된 ls 필드를 구분하기 위해 공백이 사용됩니다. 본질적으로 내가 달성하고 싶은 것은 ls 필드를 탭 또는 파이프 문자(둘 다 작동해야 함)로 구분하는 것입니다. 명령을 보고 pr공백을 탭으로 바꾸기 시작했지만 ls 출력에 공백 수가 달라서 작동하지 않았습니다. 이로 인해 이 파일을 가져올 때 오류 필드가 발생했습니다.

답변1

나중에 이 출력을 분석하고 싶다면 차단하겠습니다. 바라보다이 페이지이유를 더 잘 설명하기 위해. 어쨌든, 필요한 정보를 얻는 것은 매우 어렵습니다 ls. 특히 파일 이름에 공백이나 기타 특수 문자가 있는 경우 더욱 그렇습니다. csv 등을 빌드하려는 경우 더 나은 옵션은 다음 -printf옵션을 사용하는 것입니다 find. . 이 명령을 사용하면 시작됩니다.

find . -printf "%M|%n|%u|%s|%P\n" > output

이는 명령과 마찬가지로 시작 디렉터리에서 반복됩니다 ls. 파이프로 구분된 필드가 있는 파일에 권한, 링크 수, 소유자, 그룹, 크기 및 파일 이름을 덤프합니다. 자세한 내용은 매뉴얼 페이지를 확인하세요 find.

답변2

아무런 노력 없이도 ls를 구문 분석할 수 있습니다.시뮬레이션 ls -lstat원하는 형식으로 GNU coreutils 명령을 사용하십시오 . bash 쉘에서 globstar 옵션을 사용하여 파일을 재귀적으로 나열하고 dotglob 옵션을 사용하여 도트 파일을 나열하면 상당히 합리적인 결과를 얻을 수 있습니다. 파일 수정 시간에는 %Y"epoch 이후 초"를 사용하기로 선택했습니다. 원하는 대로 형식을 다시 지정하기 %y위해 %Y 값을 사용하거나 전달할 수도 있습니다. date에포크 이후의 초 수를 사용하는 것은 다운스트림 프로세서가 원하는 대로 이를 표시하도록 하는 매우 유연한 방법입니다.

간단한 파일의 경우:

$ stat -c "%A|%h|%U|%G|%s|%Y|%n" hosts.txt
-rw-r--r--|1|username|pgrp|135387|1202230643|hosts.txt

모방하다 ls -alR:

$ shopt -s globstar dotglob
$ stat -c "%A|%h|%U|%G|%s|%Y|%n" **
drwxr-xr-x|2|username|pgrp|4096|1510073497|.dotdir
-rw-r--r--|1|username|pgrp|0|1510073497|.dotdir/.dotfile
-rw-r--r--|1|username|pgrp|0|1507213776|f/test case
-rw-r--r--|1|username|pgrp|0|1507213776|f/test case.csv
-rw-r--r--|1|username|pgrp|135387|1202230643|hosts.txt
drwxr-xr-x|2|username|pgrp|4096|1510073307|space dir
-rw-r--r--|1|username|pgrp|0|1510073307|space dir/space file
-rwxr-xr-x|1|username|pgrp|112|1510073163|stat.sh

이는 이식성이 떨어질 수 있지만(coreutils/stat가 없는 시스템의 경우) 관심 있는 필드만 인쇄할 수 있는 유연성을 가지며 파일 이름의 공백을 바꿀 위험이 없습니다.

답변3

다음을 추가하면 됩니다.

ls -alR |  sed -r s'/\s+/|/g'

이는 출력을 수정하려는 모든 명령에 적용됩니다. \s는 "공백"을 나타내고, "+"는 하나 이상의 항목(탭 문자와 일치함)을 나타내며, "|"는 원하는 경우 몇 가지 기호가 있다는 것을 기억하세요. 탭 문자를 사용하려면 아래와 같이 "\"를 사용하여 특수 문자를 이스케이프해야 합니다.

 ls -alR |  sed -r s'/\s+/\t/g'

관련 정보