私は特定のファイルに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 -i
s
スクリプトのコマンドが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
または、ファイルごとにgrep
1つずつ実行できます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"' \)