ls -ld 및 find를 사용하면 여전히 디렉토리의 파일이 인쇄됩니다.

ls -ld 및 find를 사용하면 여전히 디렉토리의 파일이 인쇄됩니다.

나는 주어진 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전혀 그럴 필요가 없습니다. 그냥 해야 합니다. 그러나 특정 사용자가 소유한 파일만 인쇄하는 경우 재귀를 방지하는 데 사용할 수 있습니다. 절대적으로하지.findls -ld $filefind-maxdepth 0find

$ 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.

관련 정보