권한 및 소유자가 포함된 모든 파일 및 디렉터리 목록을 가져옵니다.

권한 및 소유자가 포함된 모든 파일 및 디렉터리 목록을 가져옵니다.

권한과 소유자가 포함된 모든 파일 및 디렉터리 목록을 생성해야 합니다.

-rw-rw-r--    black www-data     foo/
-rw-r--r--    black www-data     foo/foo.txt
-rw-rw-r--    black www-data     bar/
-rwxrwxr-x    black www-data     bar/foo.sh

오류가 발생한 다른 인스턴스와 비교하려면 이 목록이 필요합니다.

답변1

GNU가 있는 경우 find해당 작업을 사용할 수 있습니다 printf.

find . -printf "%M %u %g %p\n"

ls그러면 현재 디렉터리와 모든 하위 디렉터리에 있는 모든 파일이 해당 파일의 유형 및 권한 스타일 , 소유자 및 그룹, 현재 디렉터리에서 시작하는 전체 이름 과 함께 나열됩니다 .

일관된 간격을 원할 경우 필드 너비 지정자를 사용할 수 있습니다.예를 들어

find . -printf "%M %-20u %-20g %p\n"

출력 탭을 사용할 수 있습니다 \t.

답변2

statLinux에서 단일 파일이나 디렉터리에 대한 정보를 얻으려면 사용자 정의 출력 형식의 유틸리티를 사용할 수 있습니다 .

$ stat -c '%A %U %G %n' ~/.bashrc
-rw-r--r-- myself myself /home/myself/.bashrc

탭으로 구분된 출력을 원할 경우 이를 $'%A\t%U\t%G\t%n'옵션에 대한 인수 로 사용하십시오 -c( $'...'C 문자열로 이해하는 쉘에서).

현재 디렉토리와 다음 디렉토리의 모든 내용에 대한 정보를 반복적으로 얻으려면 다음을 사용하십시오 find.

find . -exec stat -c $'%A\t%U\t%G\t%n' {} +

BSD 시스템(모든 무료 시스템 및 macOS)에서는 이를 사용해야 합니다 stat -f '%Sp %Su %Sg %N'(각각은 S숫자가 아닌 "기호" 출력을 의미함). %t삽입 탭을 사용할 수도 있습니다 .

find . -exec stat -f '%Sp%t%Su%t%Sg%t%N' {} +

macOS에서 실행되는 예:

$ tree
.
├── dir1
│   └── file
└── dir2
    └── othername

3 directories, 2 files
$ find . -exec stat -f '%Sp%t%Su%t%Sg%t%N' {} +
drwxr-xr-x  myself  staff   .
drwxr-xr-x  myself  staff   ./dir2
-rw-r--r--  myself  staff   ./dir2/othername
drwxr-xr-x  myself  staff   ./dir1
-rw-r--r--  myself  staff   ./dir1/file

답변3

때때로 동적으로 변경되는 출력 형식에 독립적이려면 with 옵션을 사용하여 출력 형식을 제어하는 ls​​것이 좋습니다 . 다음은 기호를 구분 기호로 사용하여 보다 "기계 판독 가능한" 형식으로 이러한 목록을 생성합니다(선택은 임의적입니다. 자세한 내용은 마지막 단락을 참조하세요).stat--printf|

stat --printf="%A|%U|%G|%n\n" /path/to/dir/* > list_of_tiles.psv

그러면 파일 및 속성 목록이 형식으로 출력됩니다.

-rw-rw-r--|black|www-data|foo.txt
drw-rw-r--|black|www-data|bar/

그러나 하위 디렉터리의 파일과 디렉터리는 기본적으로 나열되지 않습니다. 이 목표를 달성하기 위해서는 여러 가지 방법이 있습니다.

  • Bash를 사용하는 경우 globstar재귀적으로 작동하는 와일드카드 패턴을 허용하는 옵션을 활성화할 수 있습니다.

    shopt -s globstar
    stat --printf="%A|%U|%G|%n\n" /path/to/dir/** > list_of_tiles.psv
    

    출력 포함

    drwxr-xr-x|mygroup|myuser|subdir1
    -rw-r--r--|mygroup|myuser|subdir1/subfile1.txt
    -rw-r--r--|mygroup|myuser|subdir1/subfile2.txt
    drwxr-xr-x|mygroup|myuser|subdir2
    -rw-r--r--|mygroup|myuser|subdir2/subfile3.txt
    -rw-r--r--|mygroup|myuser|that_file.txt
    -rw-r--r--|mygroup|myuser|this_file.txt
    
  • 그렇지 않으면 GNU를 사용해야 할 수도 있습니다 find.

    find . -printf '%M|%g|%u|%p\n'
    

    출력 포함

    drwxr-xr-x|mygroup|myuser|.
    drwxr-xr-x|mygroup|myuser|./subdir1
    -rw-r--r--|mygroup|myuser|./subdir1/subfile1.txt
    -rw-r--r--|mygroup|myuser|./subdir1/subfile2.txt
    drwxr-xr-x|mygroup|myuser|./subdir2
    -rw-r--r--|mygroup|myuser|./subdir2/subfile3.txt
    -rw-r--r--|mygroup|myuser|./that_file.txt
    -rw-r--r--|mygroup|myuser|./this_file.txt
    
  • 둘 다 사용할 수 없는 경우 이는 두 가지를 조합한 것입니다.

    find . -exec stat --printf="%A|%U|%G|%n\n" {} \;
    

또한 이 방법은 파일 이름 자체에 구분 기호나 개행 문자가 포함되어 있지 않은 경우에만 (자동?) 비교 목적을 달성하는 데 성공합니다 |(불행히도 문자도 허용됨). 권장되지 않는 이유 중 하나입니다.출력 구문 분석ls 또는find스크립트를 통해. 구분 기호 선택에도 동일하게 적용됩니다. 이 답변 |에서는 공백보다 파일 이름에서 덜 자주 발생하기 때문에 이를 사용합니다.

답변4

셸 에는 파일 메타데이터 검색을 위한 zsh배열 비교 연산자와 stat내장 함수가 있습니다(1996년 이후, stat2000년대 초반 GNU 및 BSD보다 앞서 있음).

거기서 당신은 할 수 있습니다:

zmodload zsh/stat
details=()
for f ($dir/**/*(DN)) stat -LsH s -- $f && details+="$s[mode] $s[uid] $s[gid] $f:t"

$details1두 개의 배열(예: 및 ) 에 있는 두 개의 별도 디렉터리에 대한 결과를 얻은 후에는 $details2다음을 수행할 수 있습니다.

print -rC1 'Only in first:' ${details1:|details2}
print -rC1 'Only in second:' ${details2:|details1}
print -rC1 'In both:' ${details1:*details2}

관련 정보