Действительно ли возможно сослаться на последний раз измененный файл в параметре командной строки?

man utmp:

utmp файл позволяет обнаруживать информацию о том, кто в настоящее время использует систему. Может быть больше пользователей, в настоящее время использующих систему, потому что не все программы используют вход utmp.

Так, это должно быть это sshd не добавляет utmp запись при обработке scp соединения. Выглядит довольно нормальным потому что scp экземпляры не являются интерактивными сессиями.

Возможно, что-то может быть сделано с помощью ForceCommand или Subsystem в sshd_config: Могло бы быть возможно перенести выполнение sftp обработчик в оболочке входа в систему.

(На самом деле я не рекомендовал бы, чтобы, лучше сохраните это простым и используйте стандартные средства входа.)

7
23.03.2012, 03:42
5 ответов
evince "$(ls -t | head -n1)"

В то время как это обработает пробелы, вкладки, и (я верю), печать экстренного сообщения, это повредится, если имя файла будет содержать новую строку, и возможно на некоторых других непечатаемых символах.

10
27.01.2020, 20:14
  • 1
    Это не будет работать на большое количество различных файлов. –  l0b0 22.03.2012, 17:14
  • 2
    @l0b0 я знаю об ограничениях парсинга ls, вот почему я упомянул их. –  Kevin 22.03.2012, 17:24
  • 3
    проблем совместимости версий спасибо, это просто и будет определенно работать на мои цели (кто, черт возьми помещает новые строки в имя файла!?) –  DQdlM 04.04.2012, 17:05
  • 4
    @DQdlM: Хакеры и люди, которые тестируют их код правильно. –  l0b0 04.04.2012, 17:21

Это - более корректный и устойчивый подход, чем 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 но не было бы трудно обобщить его для поддержки любого каталога, в этом случае смена имени будет также гарантирована.

4
27.01.2020, 20:14
  • 1
    Хорошо сделанный, хороший и полный. –  Kevin 22.03.2012, 18:01
  • 2
    ... кроме него помещает команду для выполнения вне контекста оболочки, таким образом, это не будет работать с ударом встроенные команды, псевдонимы, функции, что-либо настроенное в bashrc, и т.д. –  peth 22.03.2012, 18:48
  • 3
    @user112553 Да, который является положительной стороной. Однако это было бы тривиально для преобразования сценария в функцию, если бы пользователь так требовал. –  jw013 22.03.2012, 19:32
  • 4
    Верный. Я просто видел, что все остальные придрались к мелочам, и хотел свою собственную гниду. ;) –  peth 22.03.2012, 19:56
  • 5
    @jw013 Извините для выяснения (я - новичок), но, как Вы преобразовали бы сценарий в функцию так, чтобы это распознало Ваши псевдонимы и т.д.? Я попробовал: функционируйте last_file {источник ~/scripts/last_file.sh} В конце моего .bashrc, но псевдонимы не были сохранены. –  user1247 31.03.2012, 15:49
exec zsh
evince ~/Downloads/*.pdf(om[1])

или если Вы не хотите переключаться на zsh

cd ~/Downloads
zsh -c 'evince ./*.pdf(om[1])'

Биты между круглыми скобками являются спецификаторами шарика. om изменяет порядок на шарики для использования времени изменения, а не имени (новейший первый). [1] средства использовать только первое соответствие.

Для получения дополнительной информации см. этот ответ на, "Как я фильтрую шарик в zsh".

4
27.01.2020, 20:14

Можно использовать измененный find_date_sorted:

last_download() {
    while IFS= read -r -d '' -u 9
    do
        cut -d ' ' -f 3- <<< "$REPLY"
        break
    done 9< <(find ~/Downloads -maxdepth 1 -type f -printf '%TY-%Tm-%Td %TH:%TM:%TS %p\0' | sort -rz)
}

Это будет работать с любыми именами файлов. Открыть файл:

evince "$(last_download)"
3
27.01.2020, 20:14
  • 1
    На самом деле это не работает на файлы с новой строкой на их имя. –  Kevin 22.03.2012, 17:29
  • 2
    @Kevin: А-ч да, из-за head. Мое плохое. Должен быть зафиксирован теперь. –  l0b0 22.03.2012, 18:09
  • 3
    Даже при том, что имена файлов, заканчивающиеся в новых строках, являются редкими, нужно отметить, что замена команды разделяет запаздывание новых строк, даже когда заключено в кавычки. –  jw013 23.03.2012, 16:32
  • 4
    D'oh! Вы правы, конечно. Необходимо было бы использовать прием для фиксации этого. –  l0b0 23.03.2012, 16:39
  • 5
    Спасибо за этот ответ я всегда изучаю путь больше, чем я предназначаю, когда я приезжаю в SE! большое спасибо –  DQdlM 04.04.2012, 17:07

Нет, и даже если бы было, то Вы не могли бы быть уверены, что некоторый системный журнал обычно не будет последний раз обновленным файлом.

Ответ Kevin (он победил меня к нему), работы, если Вы просто не хотите вручную открываться ~/Downloads.

0
27.01.2020, 20:14

Теги

Похожие вопросы