Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用9位序列号对文件进行排序和重命名_Linux_Bash_Sorting_File Rename - Fatal编程技术网

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

Linux 使用9位序列号对文件进行排序和重命名,linux,bash,sorting,file-rename,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 ..... 但这不允许我单独指定起始序列号。 有什么建议我的语法有什么问题吗? 还有其他方法可以实现我的目标吗? 谢谢 像这样的?然后可以使用n来分隔起

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

ls -tr | nl -v 100000000 | while read n f; do mv "$f" "$n.jpg"; done
这会根据需要重命名文件,但序列号不在日期之后。我也试过这样做

ls -tr | cat -n .....
但这不允许我单独指定起始序列号。 有什么建议我的语法有什么问题吗? 还有其他方法可以实现我的目标吗? 谢谢

像这样的?然后可以使用n来分隔起始序列号。但是,如果文件名中有空格,则无法使用


像这样的?然后可以使用n来分隔起始序列号。但是,如果文件名中有空格,则无法使用。

如果任何文件名包含空格,则可以使用以下选项:

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
-0

find
命令将文件时间与名称一起打印。
然后对文件进行
sort
ed,并
sed
删除时间戳
xargs
通过
read

mv
命令提供文件名。如果您的任何文件名包含空格,您可以使用以下选项:

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
-0

find
命令将文件时间与名称一起打印。
然后对文件进行
sort
ed,并
sed
删除时间戳
xargs
通过
read
mv
命令提供文件名。如果可以使用外部工具,则可以使用:

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

如果需要任意增量值:

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

-inc
:指定增量值。

如果可以使用外部工具,则可以使用:

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

如果需要任意增量值:

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

-inc
:指定一个增量值。

为什么说序列号不跟在日期后面?当您单独运行
ls-tr
时,它是否会为您提供所需的订单?如果要按创建时间而不是上次修改时间排序,请使用
ls-trc
而不是
ls-tr
。请注意。在一个特定的封闭环境中,它可能对你有用,但这是一个不安全的习惯,应该尽可能避免。是的,
ls-tr
给了我想要的顺序。你为什么说序列号不跟日期走?当您单独运行
ls-tr
时,它是否会为您提供所需的订单?如果要按创建时间而不是上次修改时间排序,请使用
ls-trc
而不是
ls-tr
。请注意。在一个特定的封闭环境中,这可能对你有用,但这是一种不安全的习惯,应该尽可能避免。是的,
ls-tr
给了我想要的顺序