it-swarm.cn

批量重命名文件

我有一个充满图像的目录:

image0001.png
image0002.png
image0003.png
...

我希望单线将其重命名为(例如)。

0001.png
0002.png
0003.png
...

我该怎么做呢?

157
Internet man

如果您使用的是Bash或其他POSIX兼容的Shell:

for f in *.png; do
    mv -- "$f" "${f#image}"
done
110
W_Whalley

在Debian及其衍生产品上,Perl的renamesed类似,如下所示:

  rename -v 's/image//' *.png

还有util-linux中的rename像这样工作,相反:

  rename image '' *.png
113
Internet man

m

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'
42

我通常在这种用例中使用尼斯和简单的mmv手册页 )实用程序:

$ mmv "image*.png" "#1.png"

将执行您的任务。

目标模式中的#1将替换为源模式中与通配符匹配的任何内容。这也适用于多个通配符,并且可以用于例如更改文件名各部分的顺序。您还可以轻松地执行更复杂的操作,例如将小写字母转换为大写字母。

确保通过引用保护模式免受Shell攻击。

34
Marcel Stimberg

POSIX sh for循环

使用sed重命名

for i in image*jpg
do 
  mv -v "$i" "$(echo "$i" | sed -e 's/^\.\/image//' - )"
done
10
X Tian

我喜欢Perl,所以:

Perl -nlE '$old=$_; s/image//; qx(mv $old $_)'

您还可以对其他任务使用相同的模式,例如将文件复制到另一个目录:

Perl -nlE '$old=$_; s(image)(/path/to/new/dir/); qx(mv $old $_)'
6
gvkv

多媒体

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

6
Volker Siegel

递归的

轻松递归选择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
3
X Tian

使用 Shell括号扩展

for N in {0001..1000}; do mv "{image,}$N.png"; done
2
αғsнιη

尝试brename( https://github.com/shenwei356/brename ),这是一种实用的跨平台命令行工具,可通过正则表达式安全地批量重命名文件/目录(支持Windows,Linux和OS X) )。

@ patrickDurusa 说:

Linux提供了多种批处理文件重命名选项,但是我看不到brename的任何不足之处。

特征:

  • 跨平台。支持Windows,Mac OS X和Linux。
  • 安全。通过检查潜在的冲突和错误
  • 文件过滤通过正则表达式支持包含和排除文件。无需运行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
1
Wei Shen

POSIX sh使用while循环

find命令中读取名称。

find . -maxdepth 1 -type f -name 'image*png' | while IFS= read -r f; do
  mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"
done

从文件中读取名称

while IFS= read -r f; do mv -v "$f" "$(echo "$f"|sed -e 's/^\.\/image//' - )"; done < flist
1
X Tian

对于Windows和linux,此 Perl脚本 将起作用;在这种情况下:

$ rnm -l 's/^image//' '*.png'

该脚本可以在目录下递归运行,甚至可以在所有目录之前添加一个计数:

$ rnm -r 's/^/$counter./' '/\.png$/'

在Windows和Linux中,UTF-8字符也都正确处理。

1
circulosmeos

您可以使用此工具: rnm网页

对于您的情况,命令将是:

rnm -rs '/^image//' *.png

您可以找到更多示例/文档 此处

0
Jahid