web-dev-qa-db-ja.com

一部のファイル名を変更(接頭辞から接尾辞へ)

t_00xx_000xxx.pngおよび00xx_000xxx.pngという名前の何千ものファイルを含むディレクトリがあります。 t_で始まるファイルの名前をt_00xx_000xxx.pngから00xx_000xxx_t.pngに変更したい

したがって、接頭辞を取得して、一部のファイルの接尾辞として配置します。これは1つのコマンドだけで実行できますか?

SUSE SLES12 SP2で実行しています。

6
Mostafa Hussein

これは、最初のアンダースコアまでのすべてがプレフィックスであると想定した場合に機能します。

for f in *.png; do
    new=$(echo "$f" | sed -r 's/^([^_]*)_(.*)\.(.*)$/\2_\1.\3/');
    echo "Renaming: $f => $new";
    #mv $f $new
done

出力に問題がなければ、mvの前にある#を削除します。


prenameを使用すると、少し簡単になります。

prename -n 's/^([^_]*)_(.*)\.(.*)$/$2_$1.$3/'

t_が常にプレフィックスである場合は、次のパターンに変更します。

for f in t_*.png; do
    new=$(echo "$f" | sed -r 's/^t_(.*)\.(.*)$/\1_t.\2/');
    echo "Renaming: $f => $new";
    #mv $f $new
done
4
pLumo

ファイル名パターンがt_00xx_000xxx.pngの場合、xは任意の1文字にすることができるため、次のループでは変数文字の代わりに?グロビング文字を使用します。ループは、t_で始まり、.pngで終わるファイルのみを取得します。パラメータ拡張を使用して先頭のt_を取り除き、次に_tを目的の位置に移動するために目的の部分文字列を抽出します。

for f in t_00??_000???.png
do
  echo mv -- "$f" "${f:2:11}_t.png"
done

一部の作成されたファイル名のサンプル出力は次のとおりです。

mv t_0011_000111.png 0011_000111_t.png
mv t_0012_000345.png 0012_000345_t.png
mv t_00xx_000xxx.png 00xx_000xxx_t.png

結果が正しい場合は、echo部分を削除します。

6
Jeff Schaller

sh構文では:

for f in t_*.*; do
  dest=${f#t_}
  dest=${dest%.*}_t.${dest##*.}
  echo mv -i -- "$f" "$dest"
done
5

SuSE SLES12にmcp/mmvコマンドがある がリポジトリにある場合、mmvを使用するだけです。

mmv 't_*.png' '#1_t.png'

または、文字数と特定の数が問題である場合は、次のように具体的にすることができます。

mmv 't_00??_000???.png' '00#1#2_000#3#4#5_t.png'

mmvの最初の引数はソースであり、標準のワイルドカード*および?。 2番目の引数は宛先です。この場合、#1は、最初にワイルドカードが一致したコンテンツに置き換えられます#22番目のワイルドカードが一致したコンテンツなど。

例:

% ls -1
t_0011_000037.png
t_0011_000038.png
t_0011_000039.png
t_0022_000001.png
t_0022_000002.png

% mmv 't_*.png' '#1_t.png'

% ls -1
0011_000037_t.png
0011_000038_t.png
0011_000039_t.png
0022_000001_t.png
0022_000002_t.png
5
Matija Nalis