bash — открытие изображения только при наличии соответствующего текстового файла

#linux #bash

#linux #bash

Вопрос:

Я столкнулся с проблемой в Bash, когда я пытался открывать изображения только на основе информации, хранящейся в файлах .txt о них. Я пытаюсь отсортировать несколько изображений по размеру или высоте и отобразить изображение с ними в отсортированном порядке, но если в папке существует файл .jpg без файла .txt с тем же именем, он не должен его обрабатывать.

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

Я решил, что решение будет выглядеть так, будто я помещаю каждое имя .jpg (без расширения) в список, а затем обрабатываю список и запускаю что-то вроде:

[if -f $filename.txt ]; затем ~~~

но я столкнулся с проблемой перебора без цикла for, иначе все изображения открывались бы несколько раз. Моя попытка была:

 for i in *jpg; do
y=$y ${i.jpg}
done
if[ -f $y.txt ] then
(sorting parts)
  

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

Большое спасибо за вашу помощь!

Комментарии:

1. вы пробовали что-то вроде использования оператора and amp;amp; в вашем if заявлении?

2. @user556068 да, чтобы узнать, существуют ли имя и .txt в виде файлов, но я не уверен, как обрабатывать каждый из списка, а не только последний. Спасибо за ваш ответ!

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

Ответ №1:

Сбор списка имен файлов в одной переменной является антишаблоном. Вместо этого вы хотите собрать их в массив.

 a=()
for f in *.jpg; do
    if [ -e "${f%.jpg}".txt ]; then
        continue
    fi
    a =("$f")
done
# now do things with "${a[@]}"
  

Часто на самом деле вам не нужно собирать файлы в массив — просто делайте все, что вы делали внутри for цикла, для каждого отдельного файла по мере прохождения файлов.

(И на самом деле y=$y ${i%.jpg} не добавляется к y — он устанавливается y для себя на время попытки выполнить файл с именем i без .jpg расширения, что, скорее всего, приведет к сбою в подавляющем большинстве случаев.)

Ответ №2:

Я бы сначала выполнил проверку файла, чтобы найти только файлы отчетов, которые имеют соответствующий текстовый файл. Следующий фрагмент просто отобразит jpg файлы, имеющие соответствующий txt файл:

 find . -name "*.jpg" -maxdepth 1 -exec /bin/bash -c '[ -e "${0%.*}.txt" ] amp;amp; echo "$0";' {} ;
  

Комментарии:

1. Это выглядит как массовое бесполезное использование echo . Если вы избавитесь от внешнего echo и подстановки команд, вы также можете избавиться от grep того, что больше не будет необходимо или полезно.

2. @tripleee: да, вы правы — я изменил фрагмент кода выше.

3. find также будет проходить через подкаталоги, что не было упомянуто в требованиях. Возможно, добавить -maxdepth 1 , чтобы отключить это, и, возможно, удалить лишний подстановочный знак.