你好,我正在寻找一个 bash 解决方案来批量文件重命名。我有从数码相机获取的文件,我正在将其作为延时镜头导入。
每 1000 个图像 JPG 文件重命名就会跳转如下:
./P1020998.JPG
./P1020999.JPG
./P1030001.JPG
./P1030002.JPG
我正在尝试破解一个可重用的 shell 命令,该命令允许我删除第五个位置中的“0”,以便图像计数是连续的以便导入到 After Effects。
有谁知道删除一组文件名中第 n 个字符的最快、最简单的方法?我总是将图像集中在一个目录中,除了该目录中的图像序列之外没有其他文件。
我已经搜索过,到目前为止,解决方案似乎会从文件名中删除所有“0”字符,这不是我想要的;具体来说仅有的删除第五个字符是我想要的结果。感谢您花时间回答这个问题。
答案1
值得引用您正在使用的功能的相关手册页。来自以下EXPANSION
部分man bash
:
${parameter:offset:length}
Substring Expansion. Expands to up to length characters of the value of parameter starting at the character specified by offset. If parameter is @, an
indexed array subscripted by @ or *, or an associative array name, the results differ as described below. If length is omitted, expands to the substring
of the value of parameter starting at the character specified by offset and extending to the end of the value. length and offset are arithmetic expres‐
sions (see ARITHMETIC EVALUATION below).
If offset evaluates to a number less than zero, the value is used as an offset in characters from the end of the value of parameter. If length evaluates
to a number less than zero, it is interpreted as an offset in characters from the end of the value of parameter rather than a number of characters, and
the expansion is the characters between offset and that result. Note that a negative offset must be separated from the colon by at least one space to
avoid being confused with the :- expansion.
请注意,您可以在 内部执行算术运算${}
,因此您可以像这样参数化您的代码:
#!/bin/bash
position=5
for f in *JPG; do
mv -- "$f" "${f:0:$position-1}${f:$position}"
done
exit
这是一个快速而肮脏的解决方案,它不检查文件名的长度或任何内容,但对于像这样的黑客来说应该没问题。
答案2
使用rename
(Perl 重命名或prename
)。
rename -nv 's/^(.{4})0/$1/' ./*.jpg
我们替换:
^
断言字符串开头的位置(.{4})
是第一个捕获组,向后引用$1
;点.
匹配任何字符(除了\n
ewline),并且{4}
它与前一个标记正好匹配 4 次。0
匹配字符0。
仅使用上面捕获组的内容$1
,结果会删除第 5个字符位置处的 0 个字符(您可以将 0 替换为.
删除第 5个\n
位置处的任何字符(除了 ewline),而不是始终匹配 0 个字符)。
答案3
没关系!找出shell脚本解决方案。对于那些因为遇到同样问题而来到这里的人,这里是我使用的 shell 代码:
cd DIRECTORYPATH ## Navigate to directory with images
for f in *; do ## Begin for loop with each file in directory
x="${f::4}" ## Set x as first 4 characters
y="${f:5}" ## Set y as all characters past position 5
mv -- "$f" "$x$y" ## Use mv command to rename each file as string x+y
done
答案4
另一种方法是使用sed
#!/bin/bash
cd $DIRECTORYPATH
for f in *.JPG
do
mv $f $(echo $f | sed -e 's/\(^P[0-9]\{3\}\)0\([0-9]*\.JPG\)/\1\2/')
done
~