![절대 경로를 사용하여 특정 검색어 찾기 및 나열](https://linux55.com/image/195491/%EC%A0%88%EB%8C%80%20%EA%B2%BD%EB%A1%9C%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%8A%B9%EC%A0%95%20%EA%B2%80%EC%83%89%EC%96%B4%20%EC%B0%BE%EA%B8%B0%20%EB%B0%8F%20%EB%82%98%EC%97%B4.png)
나는 폴더 경로를 반복하고 특정 하위 폴더 이름에서 .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 ]]'])
e
val glob 한정자를 사용하여 t
경로의 ead가 중단되었는지 확인합니다(zsh의 심볼릭 링크는 절대 따라가지 않습니다).h
subfolder
**/
with 는 -exec ls -ld {} +
인수 ls
로 받은 파일을 이름별로 정렬하지만, ls
파일 수가 매우 많으면 여러 번 호출될 수 있으므로 파일이 독립적으로 정렬된 배치로 끝날 수 있다는 점에 유의하세요.
² 여기서는 glob 한정자를 사용하여 oN
glob의 목록을 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"' {} \;