#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
, чтобы отключить это, и, возможно, удалить лишний подстановочный знак.