bash find: 파일이 발견된 디렉터리를 가져옵니다.

bash find: 파일이 발견된 디렉터리를 가져옵니다.

내부에 많은 하위 폴더가 있는 "parent_folder"라는 상위 폴더가 있고 해당 하위 폴더 안에는 "foo.mp4"라는 파일이 있습니다.

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

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

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

./path/to/foo.mp4

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

답변1

그리고 GNU다음을 찾으세요:

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

다른 의 경우 find제공된 디렉토리 이름에 개행 문자가 포함되어 있지 않습니다.

find . -name foo.mp4 |
  LC_ALL=C 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 {} +

이 경우에는 파일 디렉토리에 있는 GNU -execdir에서도 사용 가능한 BSD 확장을 사용할 수 있습니다 .findchdir()

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

그러나 GNU 구현은 여기에서 find확장되지만 BSD 구현은 파일 이름이 옵션에 인수로 전달되고 항상 그러하기 때문에 여기서는 문제가 되지 않습니다. 그러나 다른 용도에서는 다음을 고려해야 합니다. 파일 이름은 or 로 시작하거나 (명령에서 옵션으로 이해됨) 포함하거나 (예를 들어 awk에 대한 변수 할당으로 이해될 수 있음), 그렇지 않으면 원인이 될 수 있습니다.{}./filenamefilenamefeatured.mp4-+=이런 종류의 문제는 다음과 관련이 있습니다.perl -p/nfind(이 경우에도 GNU 의 ./접두사 로 모두 고정되는 것은 아닙니다 .)

답변2

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

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

관련 정보