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 ]]'])
어디:
D
D
숨겨진 파일( 또는 파일) 포함oN
N
주문 목록이 없습니다o
./
디렉토리 유형 파일을 선택하십시오.e['code']
디렉터리에Database.json
손상된 기호 잉크를 포함하여 어떤 종류의 파일이 포함되어 있는지 확인하십시오L
.
어쨌든 당신은당신처럼 목록을 사후 처리할 수 있는 방법은 없습니다. 대신 다음을 수행합니다.
GNU find
및 zsh
또는 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
또한보십시오: