`find` 명령의 출력에 디렉토리를 표시하는 방법은 무엇입니까?

`find` 명령의 출력에 디렉토리를 표시하는 방법은 무엇입니까?

예를 들어, 일부 디렉터리에서 파일과 디렉터리를 찾고 있습니다.

ubuntu@example:/etc/letsencrypt$ sudo find . -name example.com*
./archive/example.com
./renewal/example.com.conf
./live/example.com
ubuntu@example:/etc/letsencrypt$ 

위 출력에서 ​​이를 어떻게 표시할 수 ./archive/example.com있으며 디렉터리는 무엇입니까?./live/example.com

답변1

다음을 사용하여 이름과 함께 파일 형식을 인쇄합니다 -printf "%y %p\n".

$ sudo find . -name 'example.com*' -printf "%y %p\n"
d ./archive/example.com
f ./renewal/example.com.conf
d ./live/example.com

의 사용은 -printfGNU ( Linux 시스템에서 find가장 일반적인 구현)를 가정합니다.find

답변2

두 번 찾기:

echo 'directories'
find . -name 'example.com*'   -type d

echo 'non-directories'
find . -name 'example.com*' ! -type d

이름 테스트에 사용된 패턴의 인용도 참고하세요. 따옴표가 없으면 쉘은 를 호출하기 전에 문자열을 현재 디렉토리의 이름과 일치시키려고 시도합니다 find. failglob쉘 옵션이 쉘에 설정되어 있거나 쉘 옵션이 설정 해제되지 않은 bash경우 , 어떤 것과도 일치하지 않는 인용되지 않은 글로빙 패턴은 쉘에서 오류를 생성하고 전혀 호출되지 않습니다.NOMATCHzshfind


또는 디렉터리 경로 이름 끝에 슬래시를 출력하면 됩니다(이것이 ls -p디렉터리를 나타내는 방법입니다).

find . -name 'example.com*' \( -type d -exec printf '%s/\n' {} \; -o -print \)

find명령은 먼저 이름이 올바른지 테스트합니다. 그것이 디렉토리이고 printf끝에 슬래시가 있는 디렉토리의 경로 이름을 출력하도록 호출합니다. 디렉토리가 아닌 경우 -print경로 이름을 그대로 출력하는 데 사용됩니다.

GNU를 사용하면 find비트 -exec printf '%s/\n' {} \;-printf '%p/\n'.

표준을 사용하면 외부 유틸리티를 가능한 한 적은 횟수로 호출 find할 수도 있지만 이는 디렉터리가 마지막으로 또는 적어도 일괄적으로 출력될 가능성이 있음을 의미합니다.-exec printf '%s/\n' {} +printf


또 다른 대안은 실제로 ls -p디렉터리를 다른 파일 형식과 구분하는 데 사용하는 것입니다. 를 사용하면 위와 마찬가지로 ls -p디렉터리가 후행 문자와 함께 나열됩니다 ./

find . -name 'example.com*' -exec ls -f -d -p {} +

나는 출력 정렬을 -f피하고 목록을 나열하지 않기 위해 여기를 사용하고 있습니다.ls-d내용물디렉토리의.

ls -F대신 ls -p에 사용할 수도 있습니다 .다른디렉토리 이외의 파일 형식에 표시합니다. 예를 들어, 실행 파일에는 접미사가 붙고 *심볼릭 링크에는 가 붙습니다 @.

-p-F(및 -f및 )는 모두 유틸리티 -d의 표준 옵션입니다 ls.

답변3

다음과 같이 사용할 수 있습니다 file.

sudo find . -name "example.com*" -print0 | xargs  -0 sudo file

예제 출력:

$ sudo find .  -name "example.com*"   -print0 | xargs  -0 sudo file
./example.com. big file: ASCII text
./example.com-dir:       directory
./example.com:           empty

답변4

gnu 옵션 없이 *nix 버전(예: macOS)에서 작동하는 보다 이식성 있는 옵션을 원하는 경우 다음과 같이 -printf디렉터리 경로 끝에 슬래시를 추가할 수 있습니다 .ls

find . -name "example.com*" -exec ls -dF {} \;

예:

$ sudo find . -name "example.com*" -exec ls -dF {} \;
./archive/example.com/
./renewal/example.com.conf
./live/example.com/

이는 또한 더 많은 Unix 명령에 대한 추가 파이핑에 더 적합한 형식입니다.

관련 정보