Настраивать

Настраивать

Я часто скачиваю 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.

Связанный контент