私の問題に対する簡単な解決策があるはずですが、見つかりません。複数のフォルダには、次のような複数のファイルがあります。模様次のように連続して何度も繰り返します。
20170223_LibError.log-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-SAE066.log_compressed_at_2017-09-27_03-32-55.gz
XYZ12
次の結果を得るには、ファイル名からパターンの1つを除いてすべてを削除する必要があります。
20170223_LibError.log-XYZ12-SAE066.log_compressed_at_2017-09-27_03-32-55.gz
ベストアンサー1
ㅏ)探す+名前(パールrename
)ソリューション:
find . -type f -name "*-XYZ12-XYZ12-*.gz" -exec prename 's/(-XYZ12)(\1)+/$1/g' {} \;
第二)追加強く打つ+探す+sedサポートされていない場合は、prename
次の方法を使用してください。
for f in $(find . -type f -name "*-XYZ12-XYZ12-*.gz"); do
p="${f%/*}" # full path without basename (parent folders)
fn="${f##*/}" # current filename (basename)
new_fn=$(sed 's/\(-XYZ12\)\+/-XVZ12/' <<<"$fn") # new file name
mv "$f" "$p/$new_fn"
done
氏)また、sed
以下を使用して上記のbashメソッドを使用する必要はありません。強く打つ変数の置換:
shopt -s extglob
for f in $(find . -type f -name "*-XYZ12-XYZ12-*.gz"); do
p="${f%/*}" # full path without basename (parent folders)
fn="${f##*/}" # current filename (basename)
new_fn="${fn/+(-XYZ12)/-XVZ12}" # new file name
mv "$f" "$p/$new_fn"
done