2017-02-27 40 views
1

我想重命名目录中的多个jpg文件,以便它们具有9位数的序列号。我也希望文件按日期从最旧到最新排序。我想出了这个:使用9位序列号对文件进行排序和重命名

ls -tr | nl -v 100000000 | while read n f; do mv "$f" "$n.jpg"; done 

这重命名文件,因为我想他们但序号不符合日期。我也试过

ls -tr | cat -n ..... 

但是,这不允许我指定起始序列号。 任何建议我的语法有什么问题? 任何其他方式来实现我的目标? 谢谢

+0

你为什么说序号不符合日期?当你单独运行'ls -tr'时,它是否给你你想要的命令?如果您想按创建时间排序,而不是最后修改时间,请使用“ls -trc”而不是“ls -tr”。 – vdavid

+0

请注意[解析ls](http://mywiki.wooledge.org/ParsingLs)。在特定的封闭环境中,它可能适合你,这是一种不安全的习惯,应尽可能避免。 – ghoti

+0

是的,'ls -tr'给了我我想要的命令 – Paul

回答

0

如果您的文件名中包含一个空格,您可以使用以下命令:

i=100000000 
find -type f -printf '%[email protected] %p\0' | \ 
sort -zk1nr | \ 
sed -z 's/^[^ ]* //' | \ 
xargs -0 -I % echo % | \ 
while read f; do 
    mv "$f" "$(printf "%09d" $i).jpg" 
    let i++ 
done 

请注意,这并不解析使用ls,但在不同的命令使用空字节作为字段分隔符,分别设定为\0,-z,-0

find命令将文件时间与名称一起打印出来。 然后文件是sort ed和sed删除时间戳。 xargs通过read将文件名提供给mv命令。

0
DIR="/tmp/images" 
FILELIST=$(ls -tr ${DIR}) 
n=1 
for file in ${FILELIST}; do 
    printf -v digit "%09d" $n 
    mv "$DIR/${file}" "$DIR/${digit}.jpg" 
    n=$[n + 1] 
done 

是这样的?然后你可以用n来指定起始序列号。但是,如果您的文件名中有空格,则不起作用。

0

如果使用外部工具是可以接受的,您可以使用rnm

rnm -ns '/i/.jpg' -si 100000000 -s/mt *.jpg 

-ns:名称字符串(新名称)。
/i/:索引(名称字符串规则)。
-si:设置起始索引的选项。
-s/mt:根据修改时间进行排序。

如果你想要一个任意增量值:

rnm -ns '/i/.jpg' -si 100000000 -inc 45 -s/mt *.jpg 

-inc:指定的增量值。

相关问题