我有一个目录,其中包含数千个文件名
t_00xx_000xxx.png
和00xx_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