Bash

辨識最新文件並將其分配給 shell 變數

  • December 6, 2021

我有一個.jpg不斷增長的文件目錄。我想在別處複製最新的一份。這是我目前擁有的並且它有效,只是好奇是否有更好的方法來辨識最新的 jpg 文件而不是使用lsand tail

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

文件名中有許多字元會導致失敗。您可以通過以下方式改進它:

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

在列表上下文中不加引號的變數(在 Bourne-like shell 中,而不是zsh)是 split+glob 運算符,您幾乎不想這樣做。--標記選項的結尾,因此"$fn"如果以 . 開頭,則不會被視為選項-

如果文件名包含換行符,但不包含空格、製表符、星號、問號、右方括號或以破折號開頭,這仍然會失敗。

最好在zsh這裡使用:

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

(.om[1])是 glob 限定符,它們是一個zsh特定的功能。將glob****限制.為正常文件(不包括符號連結、目錄、設備……),om是為了在修改時間上,並且只獲取第一個文件。[1]

請注意,如果要將其分配給 shell 變數,則必須是數組變數:

fn=(/home/pi/JPGS/*.jpg(.om[1]))

(並不是說它對你以後如何使用它有很大的影響)。

引用自:https://unix.stackexchange.com/questions/106183