Bash

遞歸對目錄及其子目錄中的所有文件執行操作

  • November 9, 2022

基於這個答案,我想對目錄及其子目錄中的所有文件執行操作。

以下命令適用於單個文件,也適用於循環中的多個文件。

for i in *.html; \
do sed -i '/<head>/a <link rel="stylesheet" href="/home/jian/postgres/doc/src/sgml/html/stylesheet.css">\' $i; \
done

但是以下命令將不起作用。

find . -type d -exec \
   for i in *.html; \
   do sed -i '/<head>/a <link rel="stylesheet" href="/home/jian/postgres/doc/src/sgml/html/stylesheet.css">\' $i; \
   done \
\;

它給出了以下錯誤:

bash: syntax error near unexpected token `do'
bash: syntax error near unexpected token `done'
;: command not found

我在這裡找到了一個相關的文章。

呼叫目前目錄或以下目錄中名稱匹配的所有正常文件sedfind``*.html

find . -name '*.html' -type f -exec sed -i '...expression...' {} +

假設您sed在上面的程式碼中正確插入了表達式,這將sed使用找到的文件的批量路徑名呼叫,確保sed呼叫的次數盡可能少*。*

或者,

shopt -s globstar dotglob failglob

sed -i '...expression...' ./**/*.html

這啟用了在路徑名**中工作*但匹配的模式(“遞歸”)。/它還允許模式匹配隱藏的名稱(就像find也會這樣做),如果沒有名稱與模式匹配,則告訴 shell 失敗並出現錯誤。

這裡的區別在於

  1. 匹配文件的文件類型未經測試(模式可能匹配目錄等)
  2. 如果該模式匹配數千個名稱,則該命令將無法執行,並出現“參數列表太長”錯誤。

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