何千ものファイル名
t_00xx_000xxx.png
で00xx_000xxx.png
始まるファイルの名前を変更したいと思いますt_
。t_00xx_000xxx.png
00xx_000xxx_t.png
したがって、一部のファイルでは、プレフィックスがサフィックスとして使用されます。単一のコマンドでこれを実行できますか?
私はSUSE SLES12 SP2を実行しています。
答え1
xが任意の単一文字である可能性があるファイル名パターンが与えられると、t_00xx_000xxx.png
次のループは?
ワイルドカードを使用して変数文字を置き換えます。このループは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
結果が正しい場合は、セクションを削除してください。
答え2
文法的にsh
:
for f in t_*.*; do
dest=${f#t_}
dest=${dest%.*}_t.${dest##*.}
echo mv -i -- "$f" "$dest"
done
答え3
もし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'
最初の引数ミリメートル波は標準ワイルドカードを使用するソースで*
あり、?
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
答え4
最初のアンダースコアの前のすべてがプレフィックスであると仮定すると機能します。
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