for in循环语句批量重命名的问题;bash

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了for in循环语句批量重命名的问题;bash相关的知识,希望对你有一定的参考价值。

我想用 for in 语句批量重命名 某个目录下的所有 jpg 图片文件 为我指定的 名字 并添加序号
我是这样写的
FileNumbers=$(ls /目录1/*.jpg | wc -l)
SeqNumber=$(`seq 1 $FileNumbers`)
for i in $(ls /目录1/*.jpg)
do mv /目录1/$in /目录1/我指定的名称"$SeqNumber".png | echo 被成功重命名的文件:$(ls /目录1/)
done

echo 可以 不要

为什么我运行 会一直没有结果/??

怎么修改?
RT 帮帮我

下面这个脚本的用法
./rename.sh 目标目录
结果是自动将目标目录中所有的*.jpg文件重命名为prefix*.png文件
但文件很多时速度很慢。
awk一行的用途是计算文件名中'.'的个数供cut删除最后一个后缀。
#!/bin/bash

pushd $1
for name in $(ls |grep '\.jpg$')
do
dots=$(echo $name|awk -v RS='.' 'ENDprint NR-1')
short=$(echo $name|cut -d . -f 1-$dots)
mv $short.jpg prefix$short.png
done
popd
参考技术A 1.能用bash应该也能用perl了,我用perl脚本批量重命名的。

2.脚本如下:(注意,该脚本未检测文件名重复问题)
#!/usr/bin/perl -s
use strict;

#你指定的名称
my $prefix = "我指定的名称";
#获取当前目下所有jpg文件
my @jpg_list = <*.jpg>;

#存放重命名的命令
my @command_list = ();

#序列号
my $seqnumber = 0;

#生成重命名命令列表
foreach my $old_name (@jpg_list)
my $new_name = $prefix.$seqnumber.".jpg";
$seqnumber = $seqnumber + 1;
push @command_list, "mv \"$old_name\" \"$new_name\"";


#执行重命名
foreach my $command (sort @command_list)
print $command."\n";
system $command;


3.执行样例:
D:\>perl rename_sqenumber.pl
mv "Sand.jpg" "我指定的名称0.jpg"
mv "St.Paul.jpg" "我指定的名称1.jpg"
mv "YokohamaBay.jpg" "我指定的名称2.jpg"

bash 通过添加数字批量重命名文件

【中文标题】bash 通过添加数字批量重命名文件【英文标题】:bash to batch rename files with adding numbers 【发布时间】:2013-10-28 09:08:09 【问题描述】:

我有一堆随机名称的 .jpg 文件。我想要一个 bash 脚本来重命名它们:

basename-0.jpg
basename-1.jpg
basename-2.jpg
.
.
.
.
basename-1000.jpg

这是我写的:

n = 0;
for file in *.jpg ; do mv  "$file" basename"$n".jpg; n+=1;  done

但上述 bash 的问题在于,在循环中,n 被视为字符串,因此 n+1 只是在新移动文件的末尾添加了另一个 '1'。 感谢您的提示。

【问题讨论】:

【参考方案1】:

在 bash shell 中使用 $((expression)) 进行算术扩展

n=0;
for file in *.jpg ; do mv  "$file" basename"$n".jpg; n=$((n+1));  done

【讨论】:

【参考方案2】:

你想要'basename'还是$(basename)?更广义的形式是:

# create basename-0.jpg, basename-1.jpg, ... basename-n.jpg
e='jpg'; j=0; for f in *.$e; do mv "$f" basename-$((j++)).$e; done

# preserve stem: <stemA>-0.jpg, <stemB>-1.jpg, ... <stem?>-n.jpg
e='jpg'; j=0; for f in *.$e; do mv "$f" "$f%.*"-$((j++)).$e; done

【讨论】:

【参考方案3】:

Bash 还可以使用 ((var++)) 等算术评估语法预先/后递增/递减变量值。

n=0;
for file in *.jpg ; do mv  "$file" basename"$n".jpg; ((n++));  done

【讨论】:

以上是关于for in循环语句批量重命名的问题;bash的主要内容,如果未能解决你的问题,请参考以下文章

bash 通过添加数字批量重命名文件

文件批量重命名 如1-2 3-4 5-6

bat批量重命名(指定替换字符)

使用 bash 脚本批量重命名 FTP 服务器上的文件

Bat批处理:批量重命名包含指定名称文件夹里的指定文件

使用 shell 脚本批量重命名