bash find : 찾은 파일의 디렉토리를 얻는다


12

하위 폴더가 많은 "parent_folder"라는 상위 폴더가 있는데이 하위 폴더에는 "foo.mp4"라는 파일이 있습니다.

이렇게하면 이러한 파일을 쉽게 찾을 수 있습니다.

mymacbook:parent_folder username$ find ./ -name "foo.mp4" -exec echo {} \;

이제 parent_folder /를 기준으로 각 파일의 경로를 반환합니다.

./path/to/foo.mp4

파일 이름없이 경로 만 반환하려면 어떻게해야합니까?


1
man find ( 액션 ) : -printf %h 파일 이름의 최상위 디렉토리 (마지막 요소를 제외한 모든 요소). 파일 이름에 슬래시가 없으면 (현재 디렉토리에 있으므로) % h 지정자는 "."로 확장됩니다. .
Costas

그 예를 보여 주시겠습니까? '-exec'뒤에 또는 이전에 넣어야합니까?
dubbelj

find ./ -name "foo.mp4" -printf "%h\n"찾은 각 파일의 경로를 한 줄씩 인쇄합니다. 평소와 같이 아무도 사용 -exec echo {}하지 않기 때문에 -print(기본값조차 생략) 또는 printf행동이 있습니다.
Costas

2
@Costas -printf는 GNU 전용입니다. OP는 OS / X (BSD 시스템)를 언급하고 있습니다.
Stéphane Chazelas

@ StéphaneChazelas 감사합니다. OS / X (BSD)에 대한 그러한 제한을 몰랐습니다. 불쌍한 맥 사용자!
Costas

답변:


20

GNU찾기 :

 find . -name foo.mp4 -printf '%h\n'

다른 find디렉토리 이름 과 함께 제공된 디렉토리 이름에는 개행 문자가 포함되지 않습니다.

 find . -name foo.mp4 | sed 's|/[^/]*$||'

또는:

 find . -name foo.mp4 -exec dirname {} \;

그러나 이것은 dirname파일 당 하나의 명령을 실행하는 것을 의미 합니다.

해당 명령을 실행 해야하는 경우 path(표준 구문)을 수행 할 수 있습니다.

 find . -name "featured.mp4" -exec sh -c '
   for file do
     dir=${file%/*}
     ffmpeg -i "$file" -c:v libvpx -b:v 1M -c:a libvorbis "$dir" featured.webm
   done' sh {} +

이 경우 비록, 당신은 사용할 수 있습니다 -execdir(GNU에서 사용할 수도 BSD 확장 find), chdir()파일의 디렉토리들 :

 find . -name "featured.mp4" -execdir \
   ffmpeg -i {} -c:v libvpx -b:v 1M -c:a libvorbis . featured.webm \;

의 GNU 구현하면서 것을 불구하고주의 find확장됩니다 {}./filename여기에, BSD의 것들로 확장 filename. 파일 이름이 옵션에 대한 인수로 전달하고 항상 그대로 확인은 여기 featured.mp4어쨌든하지만, 다른 용도로 사용하면 파일 이름으로 시작할 수 있음을 고려 할 수 있습니다 -또는 +(및 명령에 의해 옵션으로 이해) 또는 포함 =(그리고 예를 들어 AWK에 의한 변수 할당으로 이해할 수), 또는 다른 문자의 원인 과 이러한 문제를perl -p/n (모든 GNU에 의해 고정 된 그들 find'의 ./접두사하지만이 경우에) 당신이 고려해야 할 수도 등, .


당신이 신청할 때 find ., dirname으로 당신은 가질 것입니다. 전체 경로 대신.
페르시아만

이제 이것을 어떻게 변환합니까? find ./ -name "featured.mp4" -exec ffmpeg -i "{}" -c:v libvpx -b:v 1M -c:a libvorbis [NEED DIRECTORY HERE] featured.webm \; 나는 당신이 언급 한 두 번째 제안을 사용하고 있습니다.
dubbelj

@MohsenPahlevanzadeh, OP는 절대 경로를 요구하지 않았지만 경로의 dirname을 요구했습니다.
Stéphane Chazelas

@ StéphaneChazelas 투표를해서 죄송합니다.
PersianGulf

감사합니다 @ StéphaneChazelas. ffmpeg 대기열 / 일괄 처리를 도와주었습니다
dubbelj

-1

아래 명령을 사용하여 디렉토리 세부 정보 만 가져올 수 있습니다.

find ./ -name "foo.mp4" | rev | cut -d"/" -f2- | rev

문자열을 자르기 위해 세 개의 외부 유틸리티를 호출하는 것은 약간 과도합니다.
Kusalananda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.