使用9位序列号对文件进行排序和重命名

时间:2017-02-27 13:29:34

标签: linux bash sorting file-rename

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

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

这会根据我的需要重命名文件,但序列号不符合日期。我也尝试过做

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

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

3 个答案:

答案 0 :(得分: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来指定起始序列号。但是,如果文件名中有空格,则无效。

答案 1 :(得分:0)

如果您的任何文件名包含空格,则可以使用以下内容:

i=100000000
find -type f -printf '%T@ %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,{{ 1}}。

-0命令将文件时间与名称一起打印。 然后文件为findsort删除时间戳。 sed通过xargsmv命令提供文件名。

答案 2 :(得分: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:指定增量值。