Как удалить имя файла из завершения удара, на основе его суффикса?

Самая простая программа просмотра фотографий я нашел, что выставочные папки являются geeqie.

enter image description here

3
29.12.2014, 13:39
1 ответ

Вы используете i386, это 32 бита. Вы должны использовать 64 бит.

Запуск: apt-get install -f или dpkg --reconfigure

-121--146015-

С lsof man page

Lsof возвращает единицу (1), если обнаружена какая-либо ошибка, включая ошибку для поиска имен команд, имен файлов, адресов Интернета или файлов, входа в систему имена, файлы NFS, PID, PGID или UID, которые было предложено перечислить. Если -V параметр указан, lsof указывает предметы поиска, для которых не удалось выполнить поиск список.

Это означает, что предложение lsof не выполнено по какой-либо другой причине никогда не будет выполнено.

Пытались ли вы просто переместить файл, пока он все еще открыт внешним процессом? Если каталог назначения находится в той же файловой системе, то проблем с этим не возникнет, если не потребуется доступ к нему по исходному пути из третьего процесса, так как базовый inode останется прежним. В противном случае я думаю, что mv в любом случае потерпит неудачу.

Если действительно необходимо дождаться завершения внешнего процесса с файлом, лучше использовать команду, которая блокирует, а не повторно опрашивает. В Linux для этого можно использовать inotifywait . Например:

 inotifywait -e close_write /path/to/file

Если вы должны использовать lsof (возможно, для портативности), вы можете попробовать что-то вроде:

until err_str=$(lsof /path/to/file 2>&1 >/dev/null); do
  if [ -n "$err_str" ]; then
    # lsof printed an error string, file may or may not be open
    echo "lsof: $err_str" >&2

    # tricky to decide what to do here, you may want to retry a number of times,
    # but for this example just break
    break
  fi

  # lsof returned 1 but didn't print an error string, assume the file is open
  sleep 1
done

if [ -z "$err_str" ]; then
  # file has been closed, move it
  mv /path/to/file /destination/path
fi

Обновление

Как отмечено в @ JohnWHSmith ниже, наиболее безопасная конструкция всегда будет использовать цикл lsof , как и выше, так как возможно, что файл будет открыт для записи несколькими процессами (примером может служить плохо написанный демон индексирования, открывающий файлы с флагом чтения/записи, когда он действительно должен быть доступен только для чтения). inotifywait все еще может использоваться вместо сна, однако, просто замените линию сна на inotifywait -e close/path/to/file .

-121--40795-

Желаемый образец не является регексом, это bash glob и вам нужен -f , чтобы сообщить ему, что вы заполняете файлы. Кроме того, вы не хотите, чтобы по умолчанию для -o , так как это добавит в только что отфильтрованные имена файлов, либо удалить параметр, либо выбрать что-то другое (я использовал dirnames , чтобы он также завершил каталоги). Необходимо выполнить следующее задание:

complete -f -o dirnames -X '*.@(aux|pdf)' vim

Соответствующая квота страницы для используемого glob:

Если опция оболочки extglob включена с помощью shopt builtin, распознается несколько операторов согласования расширенного образца. В следующем описании: pattern-list - это список из одного или нескольких узоров, разделенных |. Составные узоры могут быть сформированы с использованием одного или нескольких из следующих подузоров:

 ? (список шаблонов)
Соответствует нулю или одному вхождению заданных узоров
* (список шаблонов)
Соответствует нулю или большему количеству вхождений заданных узоров
+ (список шаблонов)
Соответствует одному или нескольким вхождениям заданных узоров
@ (шаблон-список)
Соответствует одному из заданных узоров
! (список шаблонов)Соответствует чему-либо, кроме одного из заданных узоров

extglob уже должен быть включен по завершении bash , но если это не требуется, это также необходимо.

4
27.01.2020, 21:19

Теги

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