Определите и присвойте новый файл для окружения переменной

Я думаю, что Вы забежали вперед немного — в то время как многие люди могут согласиться, что Уэйленд имеет лучший дизайн в течение современной эры (хотя некоторые все еще не соглашаются даже относительно того), реализация еще не закончена, и он еще не делает всего, должен был настигнуть X, и при этом приложения и инструментарии не готовы к нему. Этой осенью Уэйленд, как ожидают, объявит свой API, стабильный так, чтобы инструментарии могли начать портировать, не имея необходимость волноваться о несовместимых изменениях, повреждающих их порт, в то время как разработчики Уэйленда продолжают работать над битами, все еще должен был изложить в деталях рабочий стол.

Ведущий разработчик Уэйленда сделал доклад и демонстрацию на Конференции X.Org Developer в сентябре 2012, покрыв текущее состояние и происходящую работу все еще - можно или прочитать сводку или следить за видеозаписью.

7
22.12.2013, 01:57
4 ответа

Существует много символов в именах файлов, которые сделали бы тот сбой. Можно улучшить его с:

#! /bin/sh -
cd /home/pi/JPGS || exit
fn=$(ls -t | head -n1)
mv -f -- "$fn" /home/pi/WWW/webpic.jpg

Отъезд переменной закрыл кавычки в контексте списка (в оболочках кроме zsh) split+glob оператор, Вы почти никогда не хотите сделать это. -- отмечает конец опций так "$fn" не будет взят в качестве опции, если она запустится с -.

Это все еще перестало работать, если имена файлов содержат символы новой строки, но не пространство, вкладку, звезду, вопросительный знак, правую квадратную скобку, или запускаются с тире.

Лучше всего должен использовать zsh здесь:

#! /bin/zsh -
mv -f /home/pi/JPGS/*.jpg(.om[1]) /home/pi/WWW/webpic.jpg

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

Обратите внимание что, если бы Вы хотите присвоить это переменной оболочки, которая должна была бы быть переменной типа массив:

fn=(/home/pi/JPGS/*.jpg(.om[1]))

(не, что это имеет большое значение о том, как Вы используете его позже).

12
27.01.2020, 20:14
  • 1
    Спасибо - у меня есть несколько вопросов: каково значение -- и почему zsh предпочтительный по удару здесь? Я также не уверен (.om[1]) делает. –  Levon 21.12.2013, 23:57
  • 2
    @Levon, ответ обновляется с деталями. –  Stéphane Chazelas 22.12.2013, 00:21
  • 3
    Спасибо.. хороший, чтобы хранить это для будущего возможного применения, мои имена файлов являются довольно регулярными, таким образом, я не должен буду волноваться об особых случаях для этого. –  Levon 22.12.2013, 02:24
  • 4
    @Levon, это не причина (IMO) для использования неправильного синтаксиса. Необходимо действительно привыкнуть к не записи вещей как mv $f xx который является неправильным синтаксисом и плохой практикой (и куда большинство связанных с оболочкой уязвимостей прибывает из), но mv -- "$f" xx –  Stéphane Chazelas 22.12.2013, 15:58
  • 5
    Вы правы, конечно, мой комментарий был относительно globing, не ре -- который явно важен с точки зрения безопасности также - еще раз спасибо –  Levon 22.12.2013, 16:13

Список файла

Вы могли инвертировать логику на ls немного.

$ ls -t | head -n1

Подробнее

   -t     sort by modification time, newest first

Теперь это обнаруживается сначала, таким образом, мы можем использовать head возвратить первый результат.

Примечание: Вы могли также отсортировать список ко времени изменения (ctime), хотя Вы, вероятно, собираетесь хотеть использовать, изменяют время выше - (mtime). ctime является прошлым разом, когда метаинформация состояния файла была изменена.

   -c     with -lt: sort by, and show, ctime (time of last modification of 
          file status information) with -l: show ctime and sort by name
          otherwise: sort by ctime, newest first

Например:

$ ls -tc | head -n1

Перемещение файла

Чтобы сделать перемещение более чисто, Вы захотите перенести имя файла в двойные кавычки.

Пример

$ mv -f -- "$fn" /home/pi/WWW/webpic.jpg

Это будет работать в большинстве случаев, существует горстка легальных имен файлов, где это не будет, например, файлы с новыми строками. Но они, хотя законный, редко когда-либо намеренно используются.

8
27.01.2020, 20:14
  • 1
    Спасибо - я действительно знаю имена файлов, таким образом, это не будет проблемой. Каково преимущество использования двойных кавычек вокруг переменной? –  Levon 21.12.2013, 23:58
  • 2
    он, вероятно, захочет отсортировать на mtime (который отражает время изменения содержания файла), а не ctime (который отражает время изменения метаданных также). –  Stéphane Chazelas 22.12.2013, 00:05
  • 3
    Обратите внимание, что, портативно (и как документация Вы заключаете упоминания в кавычки), Вам нужно -t опция также: ls -tc к виду на времени inode-изменения (и ls -lc отобразить время inode-изменения, и ls -ut к виду на времени доступа), –  Stéphane Chazelas 22.12.2013, 00:20
  • 4
    @Levon - двойные кавычки защищает mv команда в случаях, где существуют пробелы в именах файлов. –  slm♦ 22.12.2013, 00:57
  • 5
    Спасибо, очень полезное информационное ре использование "".. мои текущие имена файлов не будут иметь той проблемы, но я начну использовать это в качестве способа по умолчанию сделать вещи. –  Levon 22.12.2013, 02:25

Чтобы назначить самый последний файл с суффиксом jpg , где бы он ни находился, переменной оболочки:

fn = $ (найдите .jpg | xargs ls -rt | tail -1)

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

Еще один недостаток: работает некорректно при отсутствии файла с .jpg (из-за ls).

0
27.01.2020, 20:14

Наверное, я бы использовал find, так как он более общий. я только что столкнулся с вариант этого, определяющий новейший исполняемый файл, но он появляется в других местах. Команда поиска,

find.. -printf "%T@ %p\n" -type f | sort -g

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

Хотя я признаю, что в моем случае я закончил,

EXIF=`ls -t \`which -a exiftool \` | awk '{print $1}' `


which -a setup
/home/scripts/setup
/home/scripts/lat/scripts/setup
/home/documents/latex/scripts/setup
marchywka@happy$ ls -t `which -a setup `
/home/scripts/setup /home/documents/latex/scripts/setup /home/scripts/lat/scripts/setup
marchywka@happy$ ls -alt `ls -t \`which -a setup \` `
-rwxrwxrwx 1 root root 897 Oct  8 17:54 /home/scripts/setup
-rwxrwxrwx 1 root root 166 Sep 13 13:50 
/home/scripts/lat/scripts/setup
-rwxrwxrwx 1 root root 163 Jan 27  2019 /home/documents/latex/scripts/setup
0
27.01.2020, 20:14

Теги

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