将文件夹中的文件重命名为序列号

时间:2010-07-09 10:06:06

标签: bash rename batch-rename

我想将目录中的文件重命名为序号。根据文件的创建日期。

例如sadf.jpg0001.jpgwrjr3.jpg0002.jpg等等,前导零的数量取决于文件总量(不需要额外的零)如果不需要的话。)

27 个答案:

答案 0 :(得分:271)

尝试使用循环letprintf作为填充:

a=1
for i in *.jpg; do
  new=$(printf "%04d.jpg" "$a") #04 pad to length of 4
  mv -i -- "$i" "$new"
  let a=a+1
done

使用-i标志可防止自动覆盖现有文件。

答案 1 :(得分:195)

美容一行:

ls -v | cat -n | while read n f; do mv -n "$f" "$n.ext"; done 

您可以使用.ext.png等更改.jpg

答案 2 :(得分:60)

我喜欢gauteh的简洁解决方案,但它有一个重要的缺点。当运行数千个文件时,您可以获得“参数列表太长”消息(more on this),其次,脚本可能变得非常慢。就我而言,在大约36.000个文件上运行它,脚本移动了大约。每秒一件!我不确定为什么会这样,但我从同事那里得到的规则是find是你的朋友”

find -name '*.jpg' | # find jpegs
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command

要计算项目和构建命令,使用了gawk。但请注意主要区别。默认情况下,find搜索当前目录及其子目录中的文件,因此请务必仅在必要时限制对当前目录的搜索(使用man find查看方法)。

答案 3 :(得分:28)

在OSX上使用Pero的解决方案需要进行一些修改。我用过:

find . -name '*.jpg' \
| awk 'BEGIN{ a=0 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' \
| bash

注意:反斜杠用于续行

编辑2015年7月20日: 合并@ klaustopher的反馈引用\"%s\"命令的mv参数,以支持带空格的文件名。

答案 4 :(得分:25)

使用“重命名”命令

rename -N 0001 -X 's/.*/$N/' *.jpg

rename -N 0001 's/.*/$N.jpg/' *.jpg

答案 5 :(得分:23)

一个非常简单的bash one liner,它保留了原始扩展,添加了前导零,并且还可以在OSX中运行:

num=0; for i in *; do mv "$i" "$(printf '%04d' $num).${i#*.}"; ((num++)); done

简化版http://ubuntuforums.org/showthread.php?t=1355021

答案 6 :(得分:11)

要在所有情况下工作,请为名称

中包含空格的文件添加\“
find . -name '*.jpg' | gawk 'BEGIN{ a=1 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' | bash

答案 7 :(得分:8)

如果您的rename不支持-N,您可以执行以下操作:

ls -1 -c | xargs rename -n 's/.*/our $i; sprintf("%04d.jpg", $i++)/e'

编辑要从给定的数字开始,您可以使用下面的(看起来有点丑陋)代码,只需将123替换为您想要的数字:

ls -1 -c | xargs rename -n 's/.*/our $i; if(!$i) { $i=123; } sprintf("%04d.jpg", $i++)/e'

按创建时间顺序列出文件(最新的第一个,将-r添加到ls以反向排序),然后发送此文件列表进行重命名。重命名使用正则表达式中的perl代码来格式化和增加计数器。

但是,如果您使用EXIF信息处理JPEG图像,我建议exiftool

这是来自exiftool documentation,"重命名示例"

   exiftool '-FileName<CreateDate' -d %Y%m%d_%H%M%S%%-c.%%e dir

   Rename all images in "dir" according to the "CreateDate" date and time, adding a copy number with leading '-' if the file already exists ("%-c"), and
   preserving the original file extension (%e).  Note the extra '%' necessary to escape the filename codes (%c and %e) in the date format string.

答案 8 :(得分:6)

在OSX上,从Homebrew安装重命名脚本:

brew install rename

然后你可以非常轻松地做到这一点:

rename -e 's/.*/$N.jpg/' *.jpg

或者添加一个漂亮的前缀:

rename -e 's/.*/photo-$N.jpg/' *.jpg

答案 9 :(得分:1)

ls -1tr | rename -vn 's/.*/our $i;if(!$i){$i=1;} sprintf("%04d.jpg", $i++)/e'

重命名-vn - 删除 n 以进行关闭测试模式

{$ i = 1;} - 控制起始编号

“%04d.jpg” - 控件数为零 04 并设置输出扩展名 .jpg

答案 10 :(得分:1)

对我而言,这些答案组合完美无缺:

ls -v | gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | bash
  • ls -v帮助订购1 10 9正确:1 9 10订单,避免jpg的文件扩展问题JPG jpeg
  • gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }'重新编号,包含4个字符和前导零。通过避免使用mv,我不会意外地尝试覆盖已经意外具有相同数字的任何内容。
  • bash执行

请注意@xhienne所说的内容,将未知内容加入bash是一种安全风险。但是当我使用扫描的照片时,情况并非如此。

答案 11 :(得分:1)

我们假设我们将这些文件放在一个目录中,按创建顺序列出,第一个是最早的:

a.jpg
b.JPG
c.jpeg
d.tar.gz
e

然后ls -1cr完全输出上面的列表。然后,您可以使用rename

ls -1cr | xargs rename -n 's/^[^\.]*(\..*)?$/our $i; sprintf("%03d$1", $i++)/e'

输出

rename(a.jpg, 000.jpg)
rename(b.JPG, 001.JPG)
rename(c.jpeg, 002.jpeg)
rename(d.tar.gz, 003.tar.gz)
Use of uninitialized value $1 in concatenation (.) or string at (eval 4) line 1.
rename(e, 004)

对于没有扩展名的文件,会显示“使用未初始化值[...]”的警告;你可以忽略它。

-n命令中删除rename以实际应用重命名。

这个答案的灵感来自Luke’s answer of April 2014。它忽略了Gnutt根据文件总量设置前导零数的要求。

答案 12 :(得分:1)

a=1

for i in *.jpg; do
 mv -- "$i" "$a.jpg"
 a=`expr $a + 1`
done

答案 13 :(得分:1)

我遇到了类似的问题并为此编写了一个shell脚本。我已经决定发布它,无论已经发布了许多好的答案,因为我觉得它对某人有帮助。随意改进它!

numerate

@Gnutt通过输入以下内容可以实现您想要的行为:

./numerate.sh -d <path to directory> -o modtime -L 4 -b <startnumber> -r

如果省略选项-r,则仅模拟铰孔(应该有助于测试)。

otion L描述了目标数字的长度(将用前导零填充) 也可以使用选项-p <prefix> -s <suffix>添加前缀/后缀。

如果有人希望文件在编号之前以数字方式排序,只需删除-o modtime选项。

答案 14 :(得分:1)

再次使用Pero的解决方案几乎没有修改,因为find将遍历目录树中的订单项存储在目录条目中。这将(大部分)在运行之间在同一台机器上保持一致,并且基本上是&#34;文件/目录创建顺序&#34;如果没有删除。

但是,在某些情况下,您需要获取一些逻辑顺序,例如,名称,在此示例中使用。

find -name '*.jpg' | sort -n | # find jpegs
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command 

答案 15 :(得分:1)

您也可以使用 ls

ls *.JPG| awk 'BEGIN{ a=0 }{ printf "mv %s gopro_%04d.jpg\n", $0, a++ }' | bash

答案 16 :(得分:0)

如果您使用图像注释器来标记图像。

$ make qt5py3

$ python3 labelImg.py

答案 17 :(得分:0)

如今,在选择多个文件进行重命名后(我在thunar文件管理器中已经看到过),有一个选项。

  1. 选择多个文件
  2. 检查选项
  3. 选择重命名

该特定目录中的所有文件均带有提示 只需检查类别部分

答案 18 :(得分:0)

跟随命令将所有文件重命名为序列,并以小写扩展名重新命名:

rename --counter-format 000001 --lower-case --keep-extension --expr='$_ = "$N" if @EXT' *

答案 19 :(得分:0)

我花了3-4个小时为这个文章开发此解决方案: https://www.cloudsavvyit.com/8254/how-to-bulk-rename-files-to-numeric-file-names-in-linux/

if [ ! -r _e -a ! -r _c ]; then echo 'pdf' > _e; echo 1 > _c ;find . -name "*.$(cat _e)" -print0 | xargs -0 -t -I{} bash -c 'mv -n "{}" $(cat _c).$(cat _e);echo $[ $(cat _c) + 1 ] > _c'; rm -f _e _c; fi

这适用于任何类型的文件名(空格,特殊字符),方法是使用\0find进行正确的xargs转义,并且可以通过增加设置起始文件的命名偏移量echo 1和其他任何数字。

在开始时设置扩展名(此处为pdf)。它也不会覆盖任何现有文件。

答案 20 :(得分:0)

此oneliner列出当前目录中的所有文件,按创建时间戳按相反顺序排序(表示最旧的文件位于开头),并根据文件数量的需要自动重命名为尾随零。文件扩展名将被保留。

多年来,手机图片和电影通常只有一个文件夹。应用此命令,我的照片和电影已准备就绪,然后在电视或存档上以正确的顺序进行幻灯片放映。

请注意,如果您遇到文件名冲突,则会丢失文件。所以首先重命名为temp001.jpg这样的奇怪的东西然后执行到你的最终文件名。

DIGITS=$(ls | wc -l | xargs | wc -c | xargs); ls -tcr | cat -n | while read n f; do mv "$f" "$(printf "%0${DIGITS}d" $n).${f##*.}"; done

答案 21 :(得分:0)

按时间排序,限制为jpg,前导零和基本名称(如果您可能需要一个):

ls -t *.jpg | cat -n |                                           \
while read n f; do mv "$f" "$(printf thumb_%04d.jpg $n)"; done

(全部在一行,没有\

答案 22 :(得分:-1)

这对我有用。
我已经使用 rename 命令,以便如果任何文件的名称中包含空格,则 mv 命令不会在空格和实际文件之间造成混淆。

Here i replaced spaces , ' ' in a file name with '_' for all jpg files
#! /bin/bash
rename 'y/ /_/' *jpg         #replacing spaces with _
let x=0;
for i in *.jpg;do
    let x=(x+1)
    mv $i $x.jpg
done

答案 23 :(得分:-1)

这是另一个带有“rename”命令的解决方案:

find -name 'access.log.*.gz' | sort -Vr | rename 's/(\d+)/$1+1/ge'

答案 24 :(得分:-1)

此脚本将在Mac OS bash上按创建日期对文件进行排序。我用它来批量重命名视频。只需更改扩展名和名称的第一部分即可。

ls -trU *.mp4| awk 'BEGIN{ a=0 }{ printf "mv %s lecture_%03d.mp4\n", $0, a++ }' | bash

答案 25 :(得分:-2)

Pero的回答让我来到这里:)

我希望相对于时间重命名文件,因为图像查看器没有按时间顺序显示图像。

ls -tr *.jpg | # list jpegs relative to time
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command

答案 26 :(得分:-3)

要重新编号6000,一个文件夹中的文件可以使用ACDsee程序的“重命名”选项。

要定义前缀,请使用以下格式:####"*"

然后设置起始编号并按重命名,程序将使用顺序编号重命名所有6000个文件。