Find

在 find -exec 中使用 basename?

  • August 16, 2021

如果我只使用 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 分詞(當文件名包含空格時)。

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