절대 경로를 사용하여 특정 검색어 찾기 및 나열

절대 경로를 사용하여 특정 검색어 찾기 및 나열

나는 폴더 경로를 반복하고 특정 하위 폴더 이름에서 .summary 확장자를 가진 모든 파일을 찾아 ls 명령 세부 정보로 반환하는 간단한 작업을 수행하기 위해 검색했지만 파일의 절대 경로를 사용했습니다.

디스크 구조는 다음과 같습니다.

-root--disk--folder1--subfolder--a.summary  
-root--disk--folder2--subfolder--b.summary  
-root--disk--folderX--subfolder--X.summary  

이것이 내가 가진 것입니다:-

ls -lR | grep summary  
-rw-r-----  1 username group 14150 Sep  8 22:41 a.summary  
-rw-r-----  1 username group 10150 Sep  9 22:41 b.summary  

이 결과를 얻고 싶습니다.

-rw-r-----  1 username group 14150 Sep  8 22:41 /root/disk/folder1/subfolder/a.summary  
-rw-r-----  1 username group 10150 Sep  9 22:41 /root/disk/folder2/subfolder/b.summary  

권한 거부 문제가 있는 경로가 많은 경우 작업을 완료하는 더 빠른 방법이 있습니까?

답변1

find /root/disk -path '*/subfolder/*.summary' -exec ls -ld {} +

(일부 구현에서는 find파일 경로가 현재 로케일의 유효한 텍스트로 가정됩니다.)

이 명령은 .summary이름이 지정된 디렉터리 subfolder뿐만 아니라 해당 디렉터리의 하위 디렉터리에서도 파일을 찾고 *s는 /위의 문자 까지 확장될 수 있습니다 -path. 하위 디렉터리의 파일을 제외하려면 를 추가할 수 있지만 ! -path '*/subfolder/*/*', 예를 들어 제외됩니다 /root/disk/subfolder/foo/subfolder/a.summary. 일부 find구현에는 -regex정규식과 경로를 일치시키는 구현이 있으며 이를 사용할 수 있습니다 -regex '.*/subfolder/[^/]*\.summary'.

다양한 find구현을 통해 약간 다른 출력 형식을 대신 사용할 수 있습니다 -ls(파일 경로를 정렬하지 않음).-exec ls -ld {} +

액세스할 수 없는 디렉터리에 대한 오류를 숨기려면 오류를 /dev/null로 리디렉션할 수 있습니다 2> /dev/null.

아니면 그냥 사용하세요 zsh:

ls -ld /root/disk/**/subfolder/*.summary(DoN)

정렬된 목록²에는 로케일 문제가 없지만 disk또는 subfolder디렉터리가 디렉터리에 대한 심볼릭 링크인 경우 해당 디렉터리를 탐색하며 파일 목록이 너무 크면 명령이 실패할 수 있습니다( zargs이 문제 해결 참조).

심볼릭 링크 순회를 방지하려면 subfolder다음과 같이 변경할 수 있습니다.

ls -ld /root/dir/**/*.summary(DoNe['[[ $REPLY:h:t = subfolder ]]'])

eval glob 한정자를 사용하여 t경로의 ead가 중단되었는지 확인합니다(zsh의 심볼릭 링크는 절대 따라가지 않습니다).hsubfolder**/


with 는 -exec ls -ld {} +인수 ls로 받은 파일을 이름별로 정렬하지만, ls파일 수가 매우 많으면 여러 번 호출될 수 있으므로 파일이 독립적으로 정렬된 배치로 끝날 수 있다는 점에 유의하세요.

² 여기서는 glob 한정자를 사용하여 oNglob의 목록을 N정렬합니다 . 어쨌든 자체 정렬을 수행하는 o지상에서의 최적화입니다 .ls

답변2

로 끝나는 파일을 가져오려면 extension해당 상위 디렉터리는 다음 이름의 디렉터리여야 합니다 subfolder.

find . -type d -name subfolder -exec sh -c 'ls -l "$0"/*.extension' {} \;

또는 execdir 옵션을 사용할 수 있습니다

find . -type f -name '*.extension' -execdir bash -c '[ "$(basename "$PWD")" == "subfolder" ] && echo "$PWD/$0"' {} \;

관련 정보