Shell Script: Получить новейший файл (с расширением) из каталога - PullRequest
0 голосов
/ 04 апреля 2020

Я хочу получить новейший файл в каталоге. Я использую BashFAQ / 099 в качестве ссылки. Мой код:

#!/bin/bash
function newest_file() {
    local file_ext="$2"
    local files=("$1"/*."${file_ext}")
    local newest="${files[@]:0:1}"
    for f in "${files[@]}"; do
        if [[ "$f" -nt "$newest" ]]; then
            newest="$f"
        fi
    done
    echo "$newest"
}

file_path
newest_file "${1:-$HOME/Downloads}" "${2:-*}"

Вывод:

➜  bash func_get_new_file.sh $HOME/reports txt 
/home/ashwin/reports/test4.txt
➜  bash func_get_new_file.sh $HOME/reports    
newest_file:2: no matches found: /home/ashwin/reports/*.*
  1. Я получаю ошибку, когда расширение файла *. Я хочу понять, почему . не работает.
  2. Я также хочу понять синтаксис (..), используемый для создания массива файлов в каталоге, т.е. files = ("$ 1" / *. $ {file_ext}) в моем коде выше.

В соответствии с предложением @Cyrus, обновление кода согласно shellcheck. net.


При дальнейшей отладке и чтении других сообщений. Я подумал, что передача звездочки в качестве параметра хлопотно. Я обновляю свой код, чтобы проверить любые специальные символы, передаваемые в $ 2, как показано ниже:

#!/bin/bash

newest_file() {
    local file_ext="$2"
    if [[ ! "${file_ext}" =~ ^[.a-zA-Z0-9]*$ ]]; then
        echo "ERROR: file extension can have "." or alphanumberic characters. Don't provide any ext if all files should be checked"
        return 1
    fi
    [[ -z "${file_ext}" ]] && local files=("$1"/*) || local files=("$1"/*.${file_ext})
    local newest="${files[@]:0:1}"
    for f in "${files[@]}"; do
        if [[ $f -nt $newest ]]; then
            newest="$f"
        fi
    done
    echo "$newest"
}

newest_file "${1:-$HOME/Downloads}" "${2}"

Если кто-то не может предоставить простое решение для передачи звездочки, я go с вышеупомянутым решением.

...