이름이 있는 디렉토리를 찾고, 특정 최상위 파일이 포함된 경우 필터링합니다.

이름이 있는 디렉토리를 찾고, 특정 최상위 파일이 포함된 경우 필터링합니다.

Contents이름이 지정된 모든 디렉터리를 찾은 다음 찾은 결과 목록에서 필터링하고 Database.json파일 이름이 직접 포함된 디렉터리 만 포함하고 싶습니다 .

find / -type d -name Contents 2>/dev/null |
while read dir;
do
    if [ -f $dir/Database.json ]; then
        echo $dir
    fi
done

이 코드는 작동합니다. 하지만 내 생각엔 이건 너무 지나친 것 같다. 나는 이 작업을 수행하는 더 쉬운 방법이 있어야 한다고 생각합니다.

이 코드를 다시 작성하여 더 간단하게 만들 수 있나요?

답변1

GNU를 사용하면 find다음을 수행할 수 있습니다.

LC_ALL=C find . -path '*/Contents/Database.json' -printf '%h\n'

여기서는 디렉터리 이름인 경로의 시작 부분을 %h제공합니다 .h

LC_ALL=C*사용자의 로케일에 관계없이 모든 바이트 시퀀스와 일치 해야 합니다.수치, 파일 경로는 반드시 사용자 로케일의 문자가 아닌 0 이외의 모든 바이트 시퀀스로 구성될 수 있기 때문입니다.

정렬된 목록(숨겨진 목록 제외)을 제공하는 와 유사하게 zsh다음을 포함하는 디렉터리에 보고 심볼릭 링크도 추가합니다 Database.json.

print -rC1 -- **/Contents/Database.json(N:h)

더 가까운 GNU find접근 방식:

print -rC1 -- **/Contents(NDoN/e['
  [[ -e $REPLY/Database.json || -L $REPLY/Database.json ]]'])

어디:

  • DD숨겨진 파일( 또는 파일) 포함
  • oNN주문 목록이 없습니다 o.
  • /디렉토리 유형 파일을 선택하십시오.
  • e['code']디렉터리에 Database.json손상된 기호 잉크를 포함하여 어떤 종류의 파일이 포함되어 있는지 확인하십시오 L.

어쨌든 당신은당신처럼 목록을 사후 처리할 수 있는 방법은 없습니다. 대신 다음을 수행합니다.

GNU findzsh또는 bash:

while IFS= read -ru3 -d '' file; do
  something with "$file"
done 3< <(LC_ALL=C find . -path '*/Contents/Database.json' -printf '%h\0')

그리고 zsh:

for file (**/Contents/Database.json(N:h)) something with $file

또한보십시오:

관련 정보