나는 주어진 UID와 GID를 가진 모든 파일을 나열하기 위해 find를 사용합니다. 파일 집합의 다양한 속성을 인쇄해야 하기 때문에 파일 목록을 임시 파일에 저장하고 있습니다. 이러한 속성 중 하나는 설치 GID가 있는 파일입니다. 임시 파일의 내용을 배열에 넣었습니다.
a=$( < $tmpfile)
cups 패키지의 경우 tmpfile의 내용은 다음과 같습니다.
/usr/share/cups
/usr/share/cups/banners
/usr/share/cups/data
/usr/share/cups/doc-2.2.6
/usr/share/cups/doc-2.2.6/apple-touch-icon.png
/usr/share/cups/doc-2.2.6/cups.css
/usr/share/cups/doc-2.2.6/cups-printable.css
/usr/share/cups/doc-2.2.6/de
/usr/share/cups/doc-2.2.6/de/index.html
/usr/share/cups/doc-2.2.6/es
/usr/share/cups/doc-2.2.6/es/index.html
/usr/share/cups/doc-2.2.6/help
/usr/share/cups/doc-2.2.6/help/accounting.html
/usr/share/cups/doc-2.2.6/help/api-admin.html
/usr/share/cups/doc-2.2.6/help/api-filter.html
/usr/share/cups/doc-2.2.6/help/api-ppd.html
/usr/share/cups/doc-2.2.6/help/api-raster.html
/usr/share/cups/doc-2.2.6/help/cgi.html
/usr/share/cups/doc-2.2.6/help/cupspm.html
/usr/share/cups/doc-2.2.6/help/encryption.html
등....
그런 다음 다음과 같이 배열을 검색하십시오.
echo "files with group install"
for file in ${a[@]}; do
find $file -type f -user $userid -group install -exec ls -l {} \;
find $file -type d -user $userid -group install -exec ls -ld {} \;
done
여기서 두 번째 조회는 해당 디렉터리 아래의 파일을 인쇄하므로 설치 GID가 있는 하위 디렉터리는 두 번 인쇄됩니다. 이는 ls -ld가 있음에도 불구하고 발생합니다. 따라서 컵에 대한 결과는 다음과 같습니다.
drwxrwxr-t 16 cups install 4096 Dec 1 17:28 /usr/share/cups
drwxrwxr-t 2 cups install 4096 Dec 1 17:28 /usr/share/cups/ppdc
drwxrwxr-t 2 cups install 4096 Dec 1 17:21 /usr/share/cups/model
drwxrwxr-t 2 cups install 4096 Dec 1 17:28 /usr/share/cups/banners
drwxrwxr-t 3 cups install 4096 Dec 13 16:53 /usr/share/cups/drv
drwxrwxr-t 2 cups install 4096 Dec 13 16:53 /usr/share/cups/mime
drwxrwxr-t 2 cups install 4096 Dec 1 17:28 /usr/share/cups/data
drwxrwxr-t 2 cups install 4096 Dec 1 17:26 /usr/share/cups/usb
drwxrwxr-t 2 cups install 4096 Dec 1 17:28 /usr/share/cups/banners
drwxrwxr-t 2 cups install 4096 Dec 1 17:28 /usr/share/cups/data
drwxrwxr-t 3 cups install 4096 Dec 13 16:53 /usr/share/cups/drv
drwxrwxr-t 2 cups install 4096 Dec 13 16:53 /usr/share/cups/mime
drwxrwxr-t 2 cups install 4096 Dec 1 17:21 /usr/share/cups/model
drwxrwxr-t 2 cups install 4096 Dec 1 17:28 /usr/share/cups/ppdc
drwxrwxr-t 2 cups install 4096 Dec 1 17:26 /usr/share/cups/usb
나는 find가 재귀적이라는 것을 알고 있지만 반드시 exec 명령을 준수해야 하며 디렉토리의 긴 형식만 인쇄해야 합니다.
for (( i=0; i<${#a[@]}; i++ )); do
# for file in ${a[@]}; do
find ${a[i]} -user $userid -group install -type f -exec ls -l {} \;
find ${a[i]} -user $userid -group install -type d -exec ls -ld {} \;
done
동일한 결과를 제공합니다.
답변1
find $file -type d -user $userid -group install -exec ls -ld {} \;
이는 으로 반복되어 $file
내부 ls -ld
의 모든 디렉토리에서 실행됩니다. 따라서 반복하는 목록에 하위 디렉터리도 포함되어 있으면 해당 하위 디렉터리를 다시 가져오게 됩니다. 먼저 기본 디렉터리에서 find
재귀적으로 시작한 다음 매번 하위 디렉터리를 나열합니다.
비교하다:
$ mkdir -p dir1/subdir
$ for f in dir1 dir1/subdir ; do find "$f" -type d -exec ls -1d {} \; ; done
dir1
dir1/subdir
dir1/subdir
여기서 무엇을 하려는지 잘 모르겠습니다. 현재 처리 중인 파일 목록만 나열하면 됩니다. $file
전혀 그럴 필요가 없습니다. 그냥 해야 합니다. 그러나 특정 사용자가 소유한 파일만 인쇄하는 경우 재귀를 방지하는 데 사용할 수 있습니다. 절대적으로하지.find
ls -ld $file
find
-maxdepth 0
find
$ for f in dir1 dir1/subdir ; do find "$f" -maxdepth 0 -type d -exec ls -1d {} \; ; done
dir1
dir1/subdir
/usr/share/cups
그러나 모든 파일이 있는 /-ies(여기) 디렉토리를 찾아 그 디렉토리에서 실행하는 것이 더 나을지 궁금했습니다 find -user ... -group ... -exec ls -ld {} +
.
의 경우 a
할당은 a=$( < $tmpfile)
문자열을 에 할당합니다 a
. shell 과 동일하며 a[0]
, 스칼라는 어떤 의미에서는 단일 요소 배열이므로 ${#a[@]}
반환됩니다 . 1
실제 배열로 만들려면 할당이 필요 a=( $(< $tmpfile) )
하지만 공백 분할이 더 일찍 발생하게 됩니다.
대신 읽기 입력 파일을 사용할 수도 있습니다 while read ...
. 바라보다배쉬 FAQ 001.