디렉토리 트리를 재귀적으로 검색하고 주어진 문자열에 해당하는 이름으로 각 폴더에서 사용 가능한 파일 수를 나열하고 싶습니다. 실제로 다음 결과를 반환하고 싶습니다.
ls -l | wc -l
를 통해 식별하는 모든 폴더에 대해 find
.
암호
아래 코드는 이름별로 포함된 각 폴더의 파일 수를 올바르게 나열합니다.매직 데이터끈.
find /path/to/cool/stuff \
-maxdepth 4 \
-type d \
-name '*Magic Data*' \
-print0 | xargs \
--verbose \
-0 -I {} ls -l {}
그것을 확장하고 결과 ls
를 wc -l
.
시도
find /path/to/cool/stuff \
-maxdepth 4 \
-type d \
-name '*Magic Data*' \
-print0 | xargs \
--verbose \
-0 -I {} ls -l {} | wc -l
이는 실패하고 다음과 같이 인쇄됩니다.
ls -l /path/to/cool/stuff/some/folders/Magic Data
ls -l /path/to/cool/stuff/some/folders2/Magic Data
원하는 출력
/path/to/cool/stuff/some/folders/Magic Data 29
/path/to/cool/stuff/some/folders2/Magic Data 30
원하는 출력에는 다음이 포함됩니다.
- 폴더의 전체 경로 검색
- 의 출력
wc -l
(이 경우에는 숨겨지지 않은 파일 수를 반영함)
답변1
이 문제를 해결하는 두 가지 주요 방법이 있습니다.
find
관심 있는 디렉토리로만 이동한 다음 그 안에 있는 각 파일에 대한 문자를 인쇄하도록 명령을 수정하십시오x
(예:). 그런 다음 생성된 문자 수를 계산합니다wc -l
. Unix의 경로 이름에는 개행 문자가 포함될 수 있으므로 출력 문자는 경로 이름보다 안전합니다. 이 솔루션은-prune
관심이 없는 디렉터리 무시를 사용하거나! -path
.지금까지와 마찬가지로 디렉토리를 찾은 다음 인라인 스크립트를 사용하여 그 안에 있는 파일 수를 계산합니다. 아래에서 보여드리겠지만 이는 더 간단합니다.
find /path/to/cool/stuff -maxdepth 4 -type d -name "*Magic Data*' \
-exec bash -O dotglob -c '
dir=$1
set -- "$dir"/*
printf "%s %d\n" "$dir" "$#"' bash {} ';'
여기서는 여러분이 했던 것처럼 디렉터리를 찾은 다음 각 디렉터리에 대해 다음 짧은 bash
스크립트를 실행합니다.
dir=$1
set -- "$dir"/*
printf "%s %d\n" "$dir" "$#"
find
이는 명령줄에서 디렉터리의 경로 이름( 에서 제공)을 가져오고 *
그 안에 있는 glob 패턴을 확장합니다. 스크립트의 명령줄에서 셸 옵션을 설정하면 dotglob
숨겨진 파일과 디렉터리도 계산됩니다( -O dotglob
숨겨진 이름을 계산하지 않으려면 제거).
모든 이름을 매개변수로 확장하여 set
위치 매개변수를 확장된 항목으로 설정합니다. 위치 인수의 수는 그대로 사용될 수 있으므로 $#
해당 특정 디렉터리에 있는 파일의 수이기도 합니다.
관련된:
답변2
시도한 솔루션부터 시작하여 이를 수행하는 방법은 다음과 같습니다.
find /path/to/cool/stuff \
-maxdepth 4 \
-type d \
-name '*Magic Data*' \
-exec sh -c '
for d do
printf "%s: " "$PWD/$d"
find "$d/." -maxdepth 1 ! -name . -printf "\\n" | wc -l
done
' find_sh {} +
설명하다:
find
까지-영국대상 디렉터리는 레시피를 따르세요.- 대상 디렉터리, 즉 기본 이름 어딘가에 "Magic Data"라는 문자열이 있는 디렉터리를 찾으면 이를 한 묶음으로 모아
{} +
인수 목록을 통해 셸에 전달합니다.sh
sh -c '...' find_sh {} +
- 초기 인수는
sh
0번째 인수이므로$0
임의의 이름을 지정할 수 있습니다. 이 경우 이름을 로 지정했습니다find_sh
. 프로세스 목록에 표시되는 이름입니다. - 대상 디렉토리 번들은 우리가 생성하는 쉘의 매개변수
{} +
로 들어가 이를 형성합니다 .$1 $2 $3 ...
- 방금 시작한 셸에서는 대상 디렉터리(자체 제외), OTW에 있는 각 파일에 대해 줄 바꿈을 내보내고
! -name .
대상 디렉터리 이름도 wc -l 출력에 포함됩니다.
답변3
다음 명령을 사용하여 원하는 것을 얻을 수도 있습니다
여기서는 쉘을 exec
실행 한 다음 옵션을 사용하여 주어진 명령을 실행합니다. 귀하의 경우 명령은 다음과 같습니다sh
-c
ls -1 | wc -l
find /path/to/cool/stuff -maxdepth 4 -type d -name '*Magic Data*' -print0 -exec sh -c "ls -1 {} | wc -l" \;