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