ディレクトリとそのサブディレクトリ内のすべてのファイルに対して繰り返し操作を実行します。

ディレクトリとそのサブディレクトリ内のすべてのファイルに対して繰り返し操作を実行します。

に基づいてこの回答、ディレクトリとそのサブディレクトリ内のすべてのファイルに対して操作を実行したいと思います。

次のコマンドは単一のファイルでも機能しますが、ループ内の複数のファイルでも機能します。

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

現在のディレクトリまたは一致する名前を持つ次のディレクトリのすべての一般ファイルを呼び出しますsedfind*.html

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

sed上記のコードに式を正しく挿入したと仮定すると、見つかったsedファイルのバッチパス名が呼び出されます。sed呼び出しが次のようになっていることを確認してください。珍しいできるだけ何度も。

または、

shopt -s globstar dotglob failglob

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

これにより、**パターンが*パス名内で一致するように動作します/(「再帰的に」)。また、パターンマッチングによって名前を隠すこともできます(findこれも同様です)、パターンと一致する名前がない場合は、シェルにエラーが発生するように指示します。

違いは次のとおりです。

  1. 一致するファイルのファイル形式はテストされません(パターンがディレクトリなどと一致する可能性があります)。
  2. パターンが多く一致する場合数千名前がないと、「パラメータリストが多すぎます」というエラーでコマンドは実行されません。

関連情報