Shell
bash find:獲取找到的文件的目錄
我有一個名為“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'
對於其他
find
s,提供的目錄名稱不包含換行符: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
的./
前綴修復)等,您可能必須考慮.