나는 다음 명령을 내렸습니다.
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 구현을 사용하여 일반 파일만 나열하려면 다음을 사용할 수 있습니다.
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