Shell

bash find:獲取找到的文件的目錄

  • November 9, 2018

我有一個名為“parent_folder”的父文件夾,其中包含很多子文件夾,在這些子文件夾中有一個名為“foo.mp4”的文件。

我可以通過這樣做輕鬆找到這些文件:

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

現在返回每個文件的路徑,相對於 parent_folder/

./path/to/foo.mp4

我怎樣才能只返迴路徑而不返回文件名?

通過GNU查找:

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

對於其他finds,提供的目錄名稱不包含換行符:

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如此,但對於其他用途,您可能必須考慮文件名可能以-or開頭+(並被命令理解為選項)或包含=(例如,被 awk 理解為變數賦值),或導致此類問題的perl -p/n其他字元(在這種情況下,並非所有字元都由 GNUfind./前綴修復)等,您可能必須考慮.

引用自:https://unix.stackexchange.com/questions/180613