我正在努力逃避和表達評估。我正在嘗試在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'
。
任何幫助,將不勝感激。總而言之,目標是:
- 遞歸迭代
*.md
目錄中匹配的所有文件 - 在每次迭代中執行相同字串的
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' _ {} +