공백이 있는 파일/디렉토리에 대한 정보 나열

공백이 있는 파일/디렉토리에 대한 정보 나열

파일과 디렉터리에 대한 정보를 얻기 위해 ls를 사용하려고 합니다. 파일/디렉토리에 공백이 있을 때마다 현재 명령이 이름을 올바르게 가져오지 못합니다.

나는 이것을 디렉토리의 모든 파일/디렉토리를 나열하는 데 사용합니다.

ls -al --time-style=+%s . | awk '{if ($7 != ".." && $7 != "." && $1 != "total") print $1"\t"$3"\t"$5"\t"$6"\t"$7}'

내 비밀번호에 "no-spaces-dir", "some dir", "some other dir" 3개의 디렉터리가 있다고 가정하면 다음과 같은 결과가 출력됩니다.

drwxr-xr-x.     testuser    4096    1349853378      no-space-dir
drwxr-xr-x.     testuser    4096    1349853387      some
drwxr-xr-x.     testuser    4096    1349853359      two

내 awk 부분에 문제가 있다고 말하고 싶습니다. 그럼 7달러~해야 한다분명히 $8과 $9를 추가하여 내가 설정한 예에 대해 원하는 출력을 얻을 수 있지만 디렉토리에 공백이 1~2개만 있다는 것을 항상 알 수는 없습니다.

다른 정보(파일/디렉터리 권한, 사용자, 공간, 타임스탬프)를 보존하고 명령 출력에서 ​​전체 이름을 얻으려면 어떻게 해야 합니까?

답변1

문제는 awk가 공백을 필드 구분 기호로 사용하여 입력을 구문 분석한다는 것입니다. 필드에 공백이 있으면 문제가 발생할 수 있습니다.

ls"dotglob" bash 쉘 옵션을 사용하여 stat(1)구문 분석된 출력 대신 원하는 것을 얻을 수 있습니다.

shopt -s dotglob  # Enable * to match files starting with a dot
stat -c $'%A\t%U\t%s\t%Y\t%n' *

형식 문자열은 원하는 형식으로 원하는 필드를 출력합니다. $'...'를 사용하면 \t를 탭으로 확장할 수 있습니다. 필요한 경우 실제 탭 문자를 삽입하고 선행 $를 제거할 수 있습니다.

dotglob에 대한 자세한 내용을 보려면 bash(1)매뉴얼 페이지를 읽고 GLOBIGNORE를 따르십시오. stat(1)형식 문자열에 무엇을 넣을 수 있는지 알아보려면 매뉴얼 페이지를 읽어보세요 .

답변2

이미 언급했듯이 구문 분석은 ls디렉토리 내용을 인쇄하는 가장 좋은 방법은 아닙니다. 그러나 문제는 쉽게 해결됩니다.

파일/디렉토리 이름은 항상 마지막 열(또는 여러 열)이므로 $7을 인쇄하는 대신 $7부터 마지막 ​​열까지 인쇄할 수 있습니다. 다음과 같은 방법으로 이 작업을 수행할 수 있습니다.

substr($0, index($0, $7))

따라서 완전한 명령은 다음과 같습니다.

ls -al --time-style=+%s . | awk '{if ($7 != ".." && $7 != "." && $1 != "total") print $1"\t"$3"\t"$5"\t"$6"\t" substr($0,index($0,$7));}'

또한 현지화된 시스템(아마도 다른 말로) $1 != "total"에서는 작동하지 않으므로 확인하는 것은 좋은 생각이 아닙니다 . 충분한 열이 있는지 확인하기 위해 total사용하는 것이 좋습니다 .NF>6

관련 정보