Я часто скачиваю PDF-файлы с отвратительными числовыми именами файлов из моего браузера. Они автоматически попадают в ~/Downloads
. В идеале я хотел бы просто иметь возможность открывать эти файлы с помощью:
evince "the most recently modified file"
без необходимости открывать ~/Downloads
файл, чтобы найти его имя.
Есть ли простой способ указать «последний измененный файл» в bash
?
ПРИМЕЧАНИЕ: Я знаю, что этовозможныйсделать это, но в идеале я ищу решение, которое было бы проще, чем ls -t
проверять ~/Downloads
имя.
решение1
evince "$(ls -t | head -n1)"
Хотя он и обрабатывает пробелы, табуляции и (я полагаю) специальные символы печати, он перестанет работать, если имя файла содержит символ новой строки и, возможно, некоторые другие непечатаемые символы.
решение2
Это более правильный и надежный подход, чем ls -t
, но за счет некоторой дополнительной сложности.
Настраивать
Добавьте короткий скрипт оболочки (код ниже) в свой $PATH
. ~/bin
— это хорошее место для него.
Не забудьте убедиться, что
- скрипт является исполняемым
chmod +x ~/bin/script_name
~/bin
в вашем$PATH
Применение
Передайте команду, которую вы хотите выполнить для самого нового файла, ~/Download
в last_download
.
Примеры
Предположим, вы назвали скриптlast_download
last_download
(без аргументов): запускаетevince
команду по умолчанию для самого нового файла в~/Downloads
last_download mplayer
: работаетmplayer
с новейшим файлом в~/Downloads
last_download cp -t ~/Desktop
: копирует новейший файл~/Downloads
в~/Desktop
Код
#!/bin/sh
# Usage: last_download [cmd [options]...]
newest=
dir=~/Downloads
# default command
if [ $# -eq 0 ]; then
set -- evince;
fi
# find newest file
for f in "$dir"/*; do
if [ -z "$newest" ] || [ "$f" -nt "$newest" ]; then
newest="$f"
fi
done
if ! [ -e "$newest" ]; then
exit 1
fi
# run command on newest file
"$@" "$newest"
Примечание: Скрипт выполняет только поиск, ~/Download
но его несложно обобщить для поддержки любого каталога, в этом случае также потребуется сменить имя.
решение3
exec zsh
evince ~/Downloads/*.pdf(om[1])
или если вы не хотите переходить на zsh
cd ~/Downloads
zsh -c 'evince ./*.pdf(om[1])'
Биты в скобках:квалификаторы glob. om
изменяет порядок в глобах, чтобы использовать время модификации, а не имя (сначала самые новые). [1]
означает использовать только первое совпадение.
Для получения более подробной информации см.этот ответ на «Как отфильтровать глоб в zsh».
решение4
Нет, и даже если бы они были, вы не могли быть уверены, что какой-нибудь системный журнал не будет последним обновленным файлом.
Ответ Кевина (он меня опередил) работает, если вы просто хотите избежатьвручнуюоткрытие ~/Downloads
.