に基づいてこの回答、ディレクトリとそのサブディレクトリ内のすべてのファイルに対して操作を実行したいと思います。
次のコマンドは単一のファイルでも機能しますが、ループ内の複数のファイルでも機能します。
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
関連投稿を見つけました。ここ。
答え1
現在のディレクトリまたは一致する名前を持つ次のディレクトリのすべての一般ファイルを呼び出しますsed
。find
*.html
find . -name '*.html' -type f -exec sed -i '...expression...' {} +
sed
上記のコードに式を正しく挿入したと仮定すると、見つかったsed
ファイルのバッチパス名が呼び出されます。sed
呼び出しが次のようになっていることを確認してください。珍しいできるだけ何度も。
または、
shopt -s globstar dotglob failglob
sed -i '...expression...' ./**/*.html
これにより、**
パターンが*
パス名内で一致するように動作します/
(「再帰的に」)。また、パターンマッチングによって名前を隠すこともできます(find
これも同様です)、パターンと一致する名前がない場合は、シェルにエラーが発生するように指示します。
違いは次のとおりです。
- 一致するファイルのファイル形式はテストされません(パターンがディレクトリなどと一致する可能性があります)。
- パターンが多く一致する場合数千名前がないと、「パラメータリストが多すぎます」というエラーでコマンドは実行されません。