findとsedを使用してファイル名を取得する方法

findとsedを使用してファイル名を取得する方法

私は特定のファイルにsedを適用し、変更されたファイルを一覧表示して、どのファイルが変更されたかを知ることができるスクリプトを作成しています。

これが私がsedを見つけて使用した方法です。

find . -type f -a \( -name "*.txt" -o -name "*.git"\) -a -exec sed -i -e "s/"str1"/"str2"/g" {} +

変更されたファイルのファイル名をどのように出力しますか?読みやすく整列した順序で印刷したいです。

sedのみを使用している場合は、次のことができます。

sed -i 's/$pattern/$new_pattern/w changelog.txt' $filename
if [ -s changelog.txt ]; then
  # CHANGES MADE, DO SOME STUFF HERE
else
  # NO CHANGES MADE, DO SOME OTHER STUFF HERE
fi

しかし、findとsedを同時に使用する場合はどうすればよいですか?マニュアルページをチェックしてたくさん試してみましたが、何も機能しませんでした。

ベストアンサー1

sed -isスクリプトのコマンドがsed成功したかどうかにかかわらず、ファイルを再作成します(効果的にファイルの完全な新しいコピーを作成します)。

sed -iここでは、.:を含めずにGNUツールを使用したくないとしますstr1

find . -type f \( -name "*.txt" -o -name "*.git" \) -size +3c \
  -exec grep -lZ str1 {} + |
  while IFS= read -rd '' file; do
    sed -i 's/str1/str2/g' "$file" &&
      printf '%s\n' "$file"
  done

成功した場合(新しいバージョンのファイルの作成中にエラーは発生しません)、ファイル名を含むsed各ファイルに対して1つずつ実行し、str1ファイル名を印刷します。sed

または、ファイルごとにgrep1つずつ実行できますsed

find . -type f \( -name "*.txt" -o -name "*.git" \) \( -size +3c \
  -exec grep -q str1 {} \; \
  -exec sed -i 's/str1/str2/g' {} \; \
  -printf '"%p" was modified\n' \
    -o -printf '"%p" was not modified\n"' \)

おすすめ記事