Unix "find" 명령: 폴더/디렉토리 유형 표시

Unix "find" 명령: 폴더/디렉토리 유형 표시

find .항목 유형(디렉토리/파일)을 표시하는 방법은 무엇입니까 ? 실제로 항목이 파일인지 빈 디렉터리인지 알 수 없습니다.

답변1

GNU 버전에는 다양한 파일 메타데이터를 인쇄하는 find옵션이 있습니다 . -printf예를 들어,

find . -printf "%y %p\n"

파일 유형(일반 파일의 경우 f, 디렉토리의 경우 d)과 해당 이름을 인쇄합니다.

Linux 배포판은 GNU 버전을 배포하는 경향이 있습니다 find. GNU가 없으면 find작은 스크립트가 필요할 수 있습니다.

find . -exec sh -c 'ls -l "$1" | cut -c1' sh-find "{}" \; -print

(다소 추악한 출력을 개선하는 것은 독자의 연습 문제로 남겨 둡니다).

답변2

ls명령에는 디렉토리 뒤, 실행 파일 뒤, 기호 링크 뒤, 명명된 파이프 뒤에 하나를 추가하는 표준 옵션이 있습니다 -F(그리고 구현 시 더 많은 기호를 추가할 수 있습니다. 매뉴얼 참조)./*@|ls

ls -F찾은 각 항목을 호출합니다 .

find . -exec ls -1 -f -d -F {} +

-1결과를 단일 열로 가져오고 -f결과 정렬을 끄고( find경로 이름을 찾는 순서를 가져오며) -d내용 대신 디렉터리를 나열하기 위해 ("대시-원") 옵션을 추가했습니다 .

한 번에 호출할 수 있는 만큼 {} +일괄적으로 발견된 경로 이름으로 대체됩니다 .ls

예제를 실행하세요:

$ find . -exec ls -1 -f -d -F {} +
./
./.bash_profile
./.zshrc
./.bashrc
./.yashrc
./dir1/
./dir1/file-1
./dir1/subdir/
./dir1/subdir/file-2
./dir2/
./dir2/file-1
./dir2/subdir/
./dir2/subdir/file-2

특정 문자로 끝나지 않는 경로 이름은 일반 파일입니다.

답변3

다음 명령은 비슷 find .하지만 디렉터리 유형 파일에 대해 후행 슬래시를 추가합니다.

find . ! -type d -print -o -exec printf '%s/\n' {} \;

아이디어는 디렉토리를 나타내는 것입니다그리고여전히 출력에 유효한 기존 경로 이름이 표시됩니다.

노트:

  • 이 명령은 이식 가능합니다.

  • 로 끝나는 경로 이름을 사용하는 경우 .(디렉토리가 존재함) 경로 이름이 처리될 때 제공된 문자열이 대신 교체됩니다. 실제로 ./find{}///루트 디렉터리를 지정 하고 정확하게 가져오지 않는 한 이는 문제가 되지 않습니다.//. 해결 방법은 /.대신 을 지정하는 것입니다 /. 개선 사항은 후행 슬래시가 이미 있는 경우 추가하지 않는 것입니다.

    find … \( ! -type d -o -path '*/' \) -print -o -exec printf '%s/\n' {} \;
    

    여기서 는 하나 이상의 find시작 경로 이름(또는 괜찮다면 0)을 나타냅니다. 그런 다음 안전하게 지정할 수 있습니다 /.

관련 정보