如何使用shell脚本按名称对文件进行排序

7

我希望能用Shell脚本按日期对所有文件进行排序。

例如,在/Users/KanZ/Desktop/Project/Test/目录下有文件M1.hA2.hF4.h

每个文件都有不同的时间。如何按照日期和时间从旧到新对所有这些文件进行排序?

目前我有一个重命名脚本:

cd /Users/KanZ/Desktop/Project/Test/ 
n=1
for file in *.jpg;
do 
  echo $file prefix=M file_name=M$n.jpg 
  echo $file_name n=$(( $n+1 ))
  mv $file $file_name 
done 

第一次运行脚本时,JPG文件将是 M1.jpgM2.jpgM3.jpg,但如果我向该目录添加一个名为 A1.jpg 的新文件并再次运行脚本,则 M1.jpgM2.jpgM3.jpg 将被 M4.jpg 替换(在运行脚本之前,此文件名为 A1.jpg),因为第一个字母是 A,出现在 M 之前。
我希望得到的是 M1M2M3M4.jpg

问题在中途发生了变化。一开始是对*.h文件进行排序,但评论和代码反映出要对*.jpg文件进行排序。在提问时保持一致性非常重要。 - the Tin Man
4个回答

10

ls 命令可以很容易地按照最后修改时间进行排序:

$ ls -1t /Users/KanZ/Desktop/Project/Test

要反向排序,请包括-r选项:

$ ls -1tr /Users/KanZ/Desktop/Project/Test

ls命令中添加参数1会让它每行输出一个文件,不包括额外的元数据(例如长度、修改时间等)。如果您需要将列表发送给其他命令进行进一步处理,在Shell脚本中通常需要这样做。


这是从新到旧排序 - 这不是被要求的。 - Andreas Florath
然后根据需要使用 -r 标志来更改顺序。 - the Tin Man

3
尝试以下方法:

请尝试以下操作:

cd /Users/KanZ/Desktop/Project/Test
n=1
for f in `ls -tr *.jpg`; do
  mv $f M$n.jpg
  n=$(( n + 1 ))
done

什么都没有发生。难道你不应该指定文件类型吗? 例如:*.h *.jpg - kantawit
你尝试了什么?结果是什么?(无需指定文件后缀:如果未给出,则显示所有文件。) - Andreas Florath
我想首先按时间和日期对jpg文件进行排序,然后将它们重命名为A1.jpg,A2.jpg,A3.jpg。现在我可以重命名所有文件,但我想在重命名之前将它们从旧到新排序。 - kantawit
这与您的问题无关:请重新表述/更新您的初始问题。 - Andreas Florath
非常抱歉。现在我有这样的重命名脚本: cd /Users/KanZ/Desktop/Project/Test/ n=1 for file in *.jpg; do echo $file prefix=M file_name=M$n.jpg echo $file_name n=$(( $n+1 )) mv $file $file_name done第一次运行脚本后,所有的jpg文件都将变成M1.jpg M2.jpg M3.jpg,但如果我将新文件名A1.jpg添加到此目录中并再次运行脚本,则所有的M1.jpg M2.jpg M3.jpg将被M4.jpg替换(在运行脚本之前是A1.jpg),因为字母A在M之前。这是我的问题。我想得到M1 M2 M3 M4.jpg。 希望您能理解。谢谢您的帮助。 - kantawit
1
@kantawit,您需要编辑您的问题以添加该信息。 - glenn jackman

0

你需要在 ls 命令中传递 -t 选项。 -t 选项按修改时间排序,即先按最近修改的文件排序,然后再按字典顺序排序操作数。换句话说,可以使用以下命令显示最后下载的文件。

打开终端并输入以下命令。

ls -t

0

如果您需要按升序排序文件路径

ls -tUr -d $PWD/* 

可能会有用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接