更改一些文件名(前缀改为后缀)

更改一些文件名(前缀改为后缀)

我有一个目录,其中包含数千个文件名 t_00xx_000xxx.png00xx_000xxx.png.我想更改以 开头的文件的名称t_t_00xx_000xxx.png例如00xx_000xxx_t.png

因此,将前缀作为某些文件的后缀。仅用一个命令即可完成此操作吗?

我在 SUSE SLES12 SP2 上运行。

答案1

给定文件名模式t_00xx_000xxx.png,其中 x 可以是任何单个字符,以下循环使用?通配符替换变量字符。该循环仅选取以 . 开头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'

第一个论点毫米波是源,带有标准通配符*?.第二个参数是目的地,其中#1替换为第一个通配符匹配的内容,#2与第二个通配符匹配的内容等。

例子:

% 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

相关内容