find 指令的 -exec 選項中的單獨檔名和路徑

find 指令的 -exec 選項中的單獨檔名和路徑

我正在努力逃避和表達評估。我正在嘗試在find...結構內運行命令-exec COMMAND,該結構COMMAND對一個文件進行操作並輸出到標準輸出。要COMMAND在命令列上正常使用它,我只需重定向到一個新文件,如下所示:

COMMAND inputfilename.md > outputfilename.md.conf

這很好用。但是,如果我想遞歸循環全部目錄及其子目錄中的文件,使用find -exec,我似乎無法弄清楚如何分隔文件名和路徑,以便我可以正確重定向。例如,這會產生一個錯誤:

find ./ *.md -not -path './/.git/*' -exec COMMAND '{} > ~/wiki/newdirectory/{}.cong' \;

因為{}擴展了整個檔案路徑。我嘗試了basename和的各種組合dirname,但我似乎無法讓它們進行評估(相反,我只是得到字符串“basename”等)。例如,這不起作用,因為文字“basename”剛剛出現

find ./ *.md -not -path './/.git/*' -exec COMMAND  '{} > ~/wiki/newdirectory/''basename {}''.conf' \;

(傳回此錯誤:)'No such file or directory - .//newdirectory/README.md.conf > ~/wiki/newdirectory/basename .//newdirectory/README.md.conf'

任何幫助,將不勝感激。總而言之,目標是:

  1. 遞歸迭代*.md目錄中匹配的所有文件
  2. 在每次迭代中執行相同字串的COMMAND inputfile.md > ~/newdirectory/inputfile.md.conf地方。inputfile

謝謝!

答案1

無論您做什麼,都需要呼叫 shell 來將命令輸出重定向到一個文件,該文件的位置取決於結果find

find ./ *.md -not -path './/.git/*' -exec sh -c 'COMMAND "$0" > ~/wiki/newdirectory/"${0##*/}.cong"' {} \;

不要{}在 shell 腳本內進行替換。並非所有系統都支援此功能,即使在支援的情況下,這通常也不起作用,因為它將檔案名稱視為一段 shell 語法,例如,調用的檔案;rm -rf ~;.md將導致您刪除所有檔案。

${0##*/}使用純字串操作來取得檔案的基本名稱。您也可以使用$(basename -- "$0").

答案2

如果你find接受-execdir,這應該可行

find . -name '*.md' -not -path './/.git/*' -execdir COMMAND {} > ~/wiki/newdirectory/{}.cong \;

交替

find . -name '*.md' -not -path './/.git/*' -exec bash -c \
'for f; do COMMAND "$f" > ~/wiki/newdirectory/"${f##*/}".cong; done' _ {} +

相關內容