t_00xx_000xxx.png
および00xx_000xxx.png
という名前の何千ものファイルを含むディレクトリがあります。 t_
で始まるファイルの名前をt_00xx_000xxx.png
から00xx_000xxx_t.png
に変更したい
したがって、接頭辞を取得して、一部のファイルの接尾辞として配置します。これは1つのコマンドだけで実行できますか?
SUSE SLES12 SP2で実行しています。
これは、最初のアンダースコアまでのすべてがプレフィックスであると想定した場合に機能します。
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
ファイル名パターンが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
部分を削除します。
sh
構文では:
for f in t_*.*; do
dest=${f#t_}
dest=${dest%.*}_t.${dest##*.}
echo mv -i -- "$f" "$dest"
done
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