我想将目录中的文件重命名为序号。根据文件的创建日期。
例如sadf.jpg
到0001.jpg
,wrjr3.jpg
到0002.jpg
等等,前导零的数量取决于文件总量(不需要额外的零)如果不需要的话。)
答案 0 :(得分:271)
尝试使用循环let
和printf
作为填充:
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
答案 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脚本。我已经决定发布它,无论已经发布了许多好的答案,因为我觉得它对某人有帮助。随意改进它!
@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文件管理器中已经看到过),有一个选项。
该特定目录中的所有文件均带有提示 只需检查类别部分
答案 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
这适用于任何类型的文件名(空格,特殊字符),方法是使用\0
和find
进行正确的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个文件。