Find
在 find -exec 中使用 basename?
如果我只使用 basename {} .txt,它將起作用:
find . -iname "*.txt" -exec basename {} .txt \;
它只會列印 xxx 而不是 ./xxx.txt
如果我想在 -exec 選項中使用 $(basename {} .txt) ,它將失敗:
find . -iname "*.txt" -exec echo "$(basename {} .txt)" \;
它只會列印 ./xxx.txt
我怎麼解決這個問題?我希望我可以
$(basename {} .txt)
用作其他cmd的參數。我必須用 xargs做sh -c
或管道嗎?-exec basename {} \;
嘗試:
find -iname "*.txt" -exec sh -c 'for f do basename -- "$f" .txt;done' sh {} +
您的第一個命令失敗,因為
$(...)
在子shell 中執行,它被{}
視為文字。所以basename {} .txt
返回{}
,你find
變成了:find . -iname "*.txt" -exec echo {} \;
哪個列印文件名匹配。
相反,還有另一種使用 bash 管道和
xargs
命令的方法:find . -iname '*.txt' | xargs -L1 -I{} basename "{}"
在上面的
xargs
命令中:
-L1
參數表示逐行執行find
命令行的輸出。該
-I{}
參數旨在find
用雙引號將命令的輸出包裝起來,以避免 bash 分詞(當文件名包含空格時)。