将相机中的 1000 个文件导入到硬盘后,我意识到在重命名文件的过程中使用的计数器不是从 0 开始的。这导致文件结构如下:
My vacation 2018-05-03 2345.jpg
My vacation 2018-05-03 2346.jpg
My vacation 2018-05-04 2347.jpg
我想批量重命名蜡中的所有文件,索引以 0 开头
My vacation 2018-05-03 0001.jpg
My vacation 2018-05-03 0002.jpg
My vacation 2018-05-04 0003.jpg
我已经浏览了一些处理批量重命名文件的主题,并且添加计数器/索引(bash 循环)或使用重命名/改名但我无法为我的案例找到可行的解决方案。
基本上,我想使用正则表达式将文件名的部分与描述和日期进行匹配.*(\d\d\d\d\-\d\d\-\d\d){1}
,并在末尾添加后缀计数器。
答案1
和zsh
:
$ autoload -Uz zmv
$ zmv -n '(* )(<->)(.jpg)' '$1${(l[4][0])$(($2 - 2344))}$3'
mv -- 'My vacation 2018-05-03 2345.jpg' 'My vacation 2018-05-03 0001.jpg'
mv -- 'My vacation 2018-05-03 2346.jpg' 'My vacation 2018-05-03 0002.jpg'
mv -- 'My vacation 2018-05-04 2347.jpg' 'My vacation 2018-05-04 0003.jpg'
(然后,如果满意的话,删除-n
(空运行))。
对于更明确的匹配,要求文件名中包含日期 (XXXX-XX-XX)
zmv -n '(* [0-9](#c4)(-[0-9](#c2))(#c2) )(<->)(.jpg)' '$1${(l[4][0])$(($3 - 2344))}$4'
或者
zmv -n '(* <1970-2021>-<1-12>-<1-31> )(<->)(.jpg)' '$1${(l[4][0])$(($2 - 2344))}$3'
数字减去 2344。或者,您也可以按照它们的顺序排列它们,并从 1 开始编号,忽略已经存在的数字的值。如果您还希望每次日期之前的前缀发生变化时号码都会重新启动,您可以这样做:
$ typeset -A n=()
$ zmv -n '((*) <1970-2021>-<1-12>-<1-31> )(<->)(.jpg)' '$1${(l[4][0])$((++n[\$2]))}$4'
mv -- 'My other vacation 2021-01-05 0044.jpg' 'My other vacation 2021-01-05 0001.jpg'
mv -- 'My other vacation 2021-01-05 0045.jpg' 'My other vacation 2021-01-05 0002.jpg'
mv -- 'My other vacation 2021-01-05 0046.jpg' 'My other vacation 2021-01-05 0003.jpg'
mv -- 'My other vacation 2021-01-05 0047.jpg' 'My other vacation 2021-01-05 0004.jpg'
mv -- 'My other vacation 2021-01-05 0048.jpg' 'My other vacation 2021-01-05 0005.jpg'
mv -- 'My vacation 2018-05-03 2345.jpg' 'My vacation 2018-05-03 0001.jpg'
mv -- 'My vacation 2018-05-03 2346.jpg' 'My vacation 2018-05-03 0002.jpg'
mv -- 'My vacation 2018-05-04 2347.jpg' 'My vacation 2018-05-04 0003.jpg'
答案2
在文件名中,我们需要将后跟点 — 的数字序列替换为\d+.
后跟点 — 的 4 零填充计数器sprintf("%04d.", ++$c)
。
rename -n -- 'our $c; s/\d+\./sprintf("%04d.", ++$c)/e' *.jpg
对于没有零填充的情况,我们不需要sprintf
,而只需连接计数器和点。由于连接运算符也是一个点,
rename -n -- 'our $c; s/\d+\./++$c . "."/e' *.jpg
笔记
-n
当确信其工作正常时将其删除。
在某些发行版中rename
可能称为perl-rename
.
our $c;
是为了解决'全局符号“$c”需要显式的包名称'错误。在我的系统中没有必要... ́\(ツ)/ ́
答案3
#!/usr/bin/env bash
#My vacation 2018-05-03 2345.jpg
#My vacation 2018-05-03 0002.jpg
cdir="${1}";
filename_start="${2}";
# For every file.
for cfilename in ${cdir}/*; do
# If its index starts with a 0.
if [[ "${cfilename}" =~ "${filename_start} "[0-9]*-[0-9]*-[0-9]*" "[0] ]]; then
# Change its name.
mv "${cfilename}" "${cfilename}_my_addition";
fi
done
然后您需要将此代码保存为文件。
给它 .sh 结尾。
授予它权限:
chmod 700 rename_files.sh;
然后你可以使用以下命令运行它:
./rename_files.sh;
答案4
除了所有建议的答案之外,我还发现了批量重命名功能双指挥官非常有用并且适合我的需要。
这是我的设置:
- 我在文件名中添加一个计数器
[N][C]
- 我使用搜索和替换
- 搜索:
(\d{1,4})(\d{2,4})(\..{3,4}$)
- 代替:
$2$3
- 搜索:
- 您需要选中两个复选框正则表达式和使用替换
即时预览是非常有用的功能,可以快速调整和控制文件的重新索引