我有一个充满图像的目录:
image0001.png
image0002.png
image0003.png
...
我希望将其命名为(例如)。
0001.png
0002.png
0003.png
...
我该怎么做呢?
thunar -B *.png
thunar的bulk-rename gui工具容易得多。
我有一个充满图像的目录:
image0001.png
image0002.png
image0003.png
...
我希望将其命名为(例如)。
0001.png
0002.png
0003.png
...
我该怎么做呢?
thunar -B *.png
thunar的bulk-rename gui工具容易得多。
Answers:
如果您使用的是Bash或其他POSIX兼容外壳程序:
for f in *.png; do
mv -- "$f" "${f#image}"
done
在Debian和衍生产品上,Perl的rename
工作类似于sed
:
rename -v 's/image//' *.png
还有rename
from的util-linux
工作原理如下:
rename image '' *.png
rename
程序来自Perl示例发行版。Debian和Ubuntu将其作为/usr/bin/rename
。其他Unix变体可能不提供它,或者可能提供完全不同的/usr/bin/rename
。
rename
取一个从 以替换模式:rename [options] <expression> <replacement> <file>...
zsh Shell具有一个功能强大的批处理重命名命令,称为zmv
。
首先,您需要按以下方式启用zmv
命令(这可以在您的中使用~/.zshrc
)。
autoload zmv
基本语法为zmv PATTERN REPLACEMENT
。该模式是一个shell glob表达式。模式的某些部分可以用括号括起来。替换文本可以包含$1
,$2
等等,以引用模式中的第N个括号组。例如:
zmv 'image(*.png)' '$1'
您还可以要求zsh自动定义$1
,$2
等等,以匹配模式中的通配符:
zmv -w 'image*.png' '$1.png'
我通常在此用例中使用简单易用的mmv(手册页)实用程序:
$ mmv "image*.png" "#1.png"
将执行您的任务。
#1
目标模式中的in将替换为源模式中与通配符匹配的任何内容。这也适用于多个通配符,并且可以用于例如更改文件名各部分的顺序。您还可以轻松地执行更复杂的操作,例如将小写字母转换为大写字母。
确保通过引用保护图案不受外壳影响。
我喜欢Perl,所以:
perl -nlE '$old=$_; s/image//; qx(mv $old $_)'
您还可以对其他任务使用相同的模式,例如将文件复制到另一个目录:
perl -nlE '$old=$_; s(image)(/path/to/new/dir/); qx(mv $old $_)'
rename($old,$_)
命令qmv
从renameutils
打开编辑器,显示带有两个列的文件名列表,并用制表符分隔。每行显示一个文件名,两列相同。右列代表文件的新名称。
要进行更改,请编辑右侧的名称。在此示例中,:%s/...
可视块模式非常有用。
$ qmv *.png
在编辑器中:
image0001.png image0001.png
image0002.png image0002.png
image0003.png image0003.png
~
~
~
~
"/tmp/user/1000/qmvxWyVMs" 3L, 93C
在右列中编辑名称:(使用可视块模式从所有行中
删除image
前缀)
image0001.png 0001.png
image0002.png 0002.png
image0003.png 0003.png
~
~
~
~
:wq
重命名日志:
image0001.png -> 0001.png
image0002.png -> 0002.png
image0003.png -> 0003.png
(例如Ubuntu的:apt-get install renameutils
)
轻松递归选择image * png文件,并且假定不需要处理文件名中的换行符
find . -name "image*.png" | while read f; do mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; done
安全,可以处理空格,换行符,反斜杠以及其他任何内容:
find . -name "image*.png" | while IFS= read -r f; do
mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )";
done
对于Windows和linux,此Perl脚本可以完成;在这种情况下:
$ rnm -l 's/^image//' '*.png'
该脚本可以在目录下递归运行,甚至可以对所有目录进行计数:
$ rnm -r 's/^/$counter./' '/\.png$/'
在Windows和Linux中,UTF-8字符也都正确处理。
尝试brename(https://github.com/shenwei356/brename),这是一个实用的跨平台命令行工具,可通过正则表达式(支持Windows,Linux和OS X)安全地批量重命名文件/目录。
Linux有许多批处理文件重命名选项,但是我没有看到brename的任何不足之处。
特征:
find ./ -name "*.html" -exec CMD
。命令:
$ brename -f .png -p image
[INFO] checking: [ ok ] 'image0001.png' -> '0001.png'
[INFO] checking: [ ok ] 'image0002.png' -> '0002.png'
[INFO] checking: [ ok ] 'image0003.png' -> '0003.png'
[INFO] 3 path(s) to be renamed
[INFO] renamed: 'image0001.png' -> '0001.png'
[INFO] renamed: 'image0002.png' -> '0002.png'
[INFO] renamed: 'image0003.png' -> '0003.png'
[INFO] 3 path(s) renamed
ls * png | 而读-rf; 做f2 =“`echo $ f | sed -e's / image //'`”; mv $ f $ f2; 完成
ls
只会带来麻烦。read
应该是read -r
。所有变量替换都应在双引号内。
for f in *png; do f2="$(echo "$f" | sed -e 's/image//')"; mv "$f" "$f2"; done
。解析ls
既不是必需的,也不是一个好主意。