UNIX에서 목록 파일 반복

UNIX에서 목록 파일 반복

나는 다음과 같은 명령을 내렸습니다.

ls -lrt

나열된 파일과 디렉터리는 다음과 같습니다.

drwxr-xr-x   4 root root    4096 Feb  2  2014 abc
drwxr-xr-x   4 root root    4096 Feb  2  2014 cde
drwxr-xr-x   4 root root    4096 Feb  2  2014 efg
-rwxr-xr-x   4 root root    4096 Feb  2  2014 aaa.txt

이제 for 루프나 while 루프를 사용하여 나열된 출력 파일이 디렉터리인지 여부를 확인하고 싶습니다.

답변1

에서는 ls아래 명령을 사용하여 디렉터리만 나열합니다.

ls -d -- */

ls 자체를 사용하여 일반 파일을 나열하려면(파일 이름에 개행 문자가 포함되어 있지 않다고 가정) 아래 명령을 사용할 수 있습니다.

ls -p | grep -v /

GNU 및 기타 몇 가지 찾기 구현을 사용하여 일반 파일만 나열하려면 다음을 사용할 수 있습니다.

find . -maxdepth 1 -type f

(이전과 달리 숨겨진 파일도 포함되어 있으며 목록이 정렬되지 않습니다.)

표준에 해당하는 내용은 다음과 같습니다.

find . ! -name . -prune -type f

답변2

디렉토리 내용을 반복하고 파일 유형에 따라 작업을 수행하는 방법에 대한 "셸 스크립트 템플릿"과 같은 것을 원할 경우 다음에서 힌트를 얻을 수 있습니다.

for f in *
do
   if [[ -d "$f" ]]
   then
      ... your processing of directories here, reference them as "$f" ...
   fi
done

이는 현재 디렉토리의 모든 항목을 살펴보고 해당 항목이 디렉토리인지 확인한 다음 원하는 처리를 수행합니다. 디렉토리 테스트의 구문은 BASH에 따라 다릅니다. 일반적인 경우에는 if [ -d "$f" ].

또 다른 접근 방식은 목록을 디렉터리 항목으로만 제한하는 것입니다.

for d in */
do
    ... whatever you need to do on directory "$d" ...
done

답변3

모든 디렉토리를 찾기 위해 루프가 필요하지 않으며 find대신 다음 명령을 사용할 수 있습니다.

find . -maxdepth 1 -type d

그러면 현재 디렉터리의 모든 디렉터리가 나열됩니다. 출력 을 원하면 다음을 ls -l수행할 수 있습니다.

find . -maxdepth 1 -type d | xargs ls -ld

루프를 실제로 사용하려면 다음 구성을 사용할 수 있습니다.

for file in $(ls)
do
  if [[ -d $file ]]
  then
    ls -ld $file
  fi
done

루프 for는 에서 반환된 모든 항목을 반복한 다음 항목이 디렉터리인지 테스트합니다 ls.if

답변4

디렉토리 이름 나열

compgen -d

지점부터 시작하지 않고

compgen -d -X '.*' | xargs ls -dlrt

관련 정보