複数のファイルの名前を変更し、パターンインスタンスを1つだけ残し、すべて削除します。

複数のファイルの名前を変更し、パターンインスタンスを1つだけ残し、すべて削除します。

私の問題に対する簡単な解決策があるはずですが、見つかりません。複数のフォルダには、次のような複数のファイルがあります。模様次のように連続して何度も繰り返します。

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

答え2

または試してみることができます:

find . -type f -name "*-XYZ12*" | sed 'p;s/\(-XYZ12\)\{1,\}/-XYZ12/' | xargs -n2 mv

バラよりトピック

答え3

そしてksh93

for f in ~(N)*.log@(-+([^-]))\1*.log*; do
  echo mv -- "$f" "${f/@(*.log)@(-+([^-]))+(\2)/\1\2}"
done

(幸せなら削除echo)。

  • ~(N):このパターンのnullglob
  • @(...):グループ化(一致するコンテンツを\1
  • +(...):1つ以上の項目です...
  • それで繰り返し*.log@(-+([^-]))\1*.log*が続きます。*.log-<non-hyphens>*.log*
  • ${f//pattern/replacement}:パターン置換演算子。

したがって、次whatever.log-repeat-repeat-repeatwhatever.logwhatever.log-repeatwhatever.log

また、見ることができますそこシェルグローブの逆参照サポートに関する追加情報。

答え4

最も簡単な方法は、最初のインスタンスを削除してXYZ12-最初のインスタンスを-次に置き換えることです-XYZ12-

$ echo 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 | sed -E 's,XYZ12-,,g' | sed 's,-,-XYZ12-,'
20170223_LibError.log-XYZ12-SAE066.log_compressed_at_2017-09-27_03-32-55.gz

編集する:事前にわからない場合は、XYZ12抽出を利用してくださいcut。たとえば、do.sh次のスクリプトを作成します。

#!/usr/bin/env sh

pattern=$(echo "$1" | cut -d- -f2)

echo "$1" | sed -E "s,$pattern-,,g" | sed "s,-,-$pattern-,"

使用法:

$ ./do.sh  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-XYZ12-XYZ12-SAE066.log_compressed_at_2017-09-27_03-32-55.gz
20170223_LibError.log-XYZ12-SAE066.log_compressed_at_2017-09-27_03-32-55.gz

別のモードがあります:

$ ./do.sh  20170223_LibError.log-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-SAE066.log_compressed_at_2017-09-27_03-32-55.gz
20170223_LibError.log-NMNM-SAE066.log_compressed_at_2017-09-27_03-32-55.gz

関連情報