Я хочу получить новейший файл в каталоге. Я использую 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/*.*
- Я получаю ошибку, когда расширение файла *. Я хочу понять, почему . не работает.
- Я также хочу понять синтаксис (..), используемый для создания массива файлов в каталоге, т.е. 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 с вышеупомянутым решением.