识别最新文件并将其分配给 shell 变量

Lev*_*von 7 bash timestamps files

我有一个.jpg不断增长的文件目录。我想在别处复制最新的一份。这就是我目前拥有的并且有效,只是想知道是否有更好的方法来识别最新的 jpg 文件而不是使用lstail

#!/bin/bash
cd /home/pi/JPGS
fn=$(ls -rt1 | tail -1)
mv -f $fn /home/pi/WWW/webpic.jpg
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 12

文件名中有许多字符会导致失败。您可以通过以下方式改进它:

#! /bin/sh -
cd /home/pi/JPGS || exit
fn=$(ls -t | head -n1)
mv -f -- "$fn" /home/pi/WWW/webpic.jpg
Run Code Online (Sandbox Code Playgroud)

在列表上下文中(在类似 Bourne 的 shell 中,除了zsh)不加引号是 split+glob 运算符,您几乎不想这样做。--标记选项的结尾,因此"$fn"如果它以-.开头,则不会被视为选项。

如果文件名包含换行符,但不包含空格、制表符、星号、问号、右方括号或以破折号开头,那仍然会失败。

最好zsh在这里使用:

#! /bin/zsh -
mv -f /home/pi/JPGS/*.jpg(.om[1]) /home/pi/WWW/webpic.jpg
Run Code Online (Sandbox Code Playgroud)

(.om[1])是 glob 限定符,它们是一个zsh特定的功能。.限制了水珠,以普通文件(不包括符号链接,目录,设备......),omØ上刻申odification时间,[1]只取第一个文件。

请注意,如果要将其分配给 shell 变量,则必须是数组变量:

fn=(/home/pi/JPGS/*.jpg(.om[1]))
Run Code Online (Sandbox Code Playgroud)

(并不是说它对您以后使用它的方式有很大影响)。


slm*_*slm 8

清单文件

你可以ls稍微颠倒一下逻辑。

$ ls -t | head -n1
Run Code Online (Sandbox Code Playgroud)

细节

   -t     sort by modification time, newest first
Run Code Online (Sandbox Code Playgroud)

现在它首先出现,所以我们可以head用来返回第一个结果。

注意:您也可以按更改时间 (ctime) 对列表进行排序,尽管您可能想要使用上面的修改时间 - (mtime)。ctime 是最后一次更改文件状态元信息的时间。

   -c     with -lt: sort by, and show, ctime (time of last modification of 
          file status information) with -l: show ctime and sort by name
          otherwise: sort by ctime, newest first
Run Code Online (Sandbox Code Playgroud)

例如:

$ ls -tc | head -n1
Run Code Online (Sandbox Code Playgroud)

移动文件

为了更干净地进行移动,您需要将文件名用双引号括起来。

例子

$ mv -f -- "$fn" /home/pi/WWW/webpic.jpg
Run Code Online (Sandbox Code Playgroud)

这将在大多数情况下起作用,有一些合法的文件名不会,例如,带有新行的文件。但是这些虽然合法,却很少被有意使用。