권한과 소유자가 포함된 모든 파일 및 디렉터리 목록을 생성해야 합니다.
-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
stat
Linux에서 단일 파일이나 디렉터리에 대한 정보를 얻으려면 사용자 정의 출력 형식의 유틸리티를 사용할 수 있습니다 .
$ 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년 이후, stat
2000년대 초반 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}