파일과 디렉터리에 대한 정보를 얻기 위해 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