Как вывести все BASH результатов поиска в одну переменную? Подробнее в посте - PullRequest
0 голосов
/ 23 апреля 2020

ПОСЛЕДНИЕ ОБНОВЛЕНИЯ:

Я почти понял это с некоторой помощью Ричарда Джессопа и его комментарием. Это вывод, который у меня сейчас есть:

(\
"DSC009.jpg"\
"wallpaper.png"\
"image732.bmp"\
"animated.gif"\
)

Мне просто нужно переключить этот последний \ на ), и это должно быть хорошо!

// END ОБНОВЛЕНИЯ

О программе:

Мне нужно найти во всех подпапках все файлы с указанным расширением (ями) (.png, .jpg, gif .bmp). Затем в идеале выведите полный список всех результатов в одну переменную точно так же, как показано в примере ниже. Результаты чувствительны к регистру и должны быть заключены в «двойные кавычки» и разделены escape-символом \, как показано. Это должно быть выполнено из сценария bash, а НЕ из командной строки.

imagefiles=$(\
    "DSC009.jpg"\
    "wallpaper.png"\
    "image732.bmp"\
    "animated.gif")

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

Поэтому код должен выглядеть примерно так:

var = "$ (введите код здесь)"

Я пробовал множество решений и вариантов, без удачи, даже просто получить некоторые результаты, которые я ищу. Как кто-то предположил, вот одна такая попытка, которая не удалась. Опять же, это всего лишь несколько вариантов. Я пробовал без кавычек, кавычки, одинарные кавычки и т. Д. c ($ path не содержит пробелов).

imagefiles="find $path -type f -name \".\(png|jpg\|gif\|bmp\)\" -printf '%f\n'"

imagefiles=$("find $path -type f -name \".\(png|jpg\|gif\|bmp\)\""

imagefiles="$(find '$path' -type f \( -iname \*.jpg -o -iname \*.png \))"

imagefiles="$(find $path -type f *.png)"

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

РЕДАКТИРОВАТЬ: Для дальнейшего пояснения приведем еще один простой пример:

#!/bin/bash

#ROOT PATH OF FOLDERS CONTAINING IMAGES
path="/media/backup/photos/"

#FIND ALL IMAGE TYPES
imagefiles="$(find $path -type f '.\(png|jpg\|gif\|bmp\)\')"

#REMOVE IMAGE PATHS
list=`basename "$imagefiles"`

#CHECK TO VERIFY/DEBUG OUTPUT
echo "$list" > /media/found.txt
#FOUND.TXT SHOULD LOOK LIKE:
#DSC009.jpg
#wallpaper.png
#image732.bmp
#animated.gif

#CREATE NEW VARIABLE BUT SOMEHOW OUTPUT LIKE EXAMPLE BELOW
images="$(cat found.txt)"
#EXAMPLE:
#(\
#"DSC009.jpg"\
#"wallpaper.png"\
#"image732.bmp"\
#"animated.gif")

Надеюсь, это прояснит ситуацию немного лучше.

Ответы [ 3 ]

0 голосов
/ 23 апреля 2020

Вы можете использовать find -printf для вывода каждого результата так, как вы этого хотите. Заголовок и модификацию последнего элемента можно легко выполнить с помощью sed:

myvar="$(
  find "${path?}" \( -name '*.png' -o -name '*.jpg' \)  -printf '"%f"\\\n' |
    sed -e '1i(\\' -e '$s,\\$,),'
)"

. При этом используется 1i для указания вставки в строке 1 и $s для подстановки последнего строка, в частности трейлинг \ с )

Если вам нужно больше POSIX-совместимости, вы можете сделать:

myvar="$(
  printf '%s\n' '(\'
  find "${path?}" -name '*.png' -o -name '*.jpg' |
    sed -e 's,\(.*/\)*\(.*\),"\2"\\,' -e '$s,\\$,),'
)"
0 голосов
/ 25 апреля 2020

Особая благодарность @Richard Jessop & @that, другому парню за их посты, которые помогли направить меня в правильном направлении. Как и любой другой, которому потребовалось время и усилия, чтобы прокомментировать.

Я знаю, что разбор с ls является табу, как , упомянутый здесь , однако в моем случае это работает как задумано и было легко настроить.

Если вы знаете лучший способ достижения таких же результатов, пожалуйста, непременно поделитесь им с другими. Имейте в виду, в моем случае -printf недоступен.

Вот рабочее решение, которое я нашел!

#!/bin/bash

imagePath="/media/photos/"

#Remove the previous results before beginning
rm -f /media/images.txt

#List all images found with matching extensions and output only the filenames to images.txt file.
for images in $(ls -a -R $imagePath | egrep '\.JPG$|\.jpg$|\.png$|\.PNG$')
do
   #Output filenames like so "IMAGENAME.EXT"\
   echo -e "   \"$images\"\\" >> /media/images.txt
done

#'1i (\\' Starts the file with (\ and '$s,\\$,),' substitutes the final \ with a ).  
sed -i -e '1i (\\' -e '$s,\\$,),' /media/images.txt

#Creates a Variable from the output in the images.txt file.
myVar=$(cat /media/images.txt)

#See, it works!
echo "$myVar"
0 голосов
/ 23 апреля 2020

Вот частичное решение:

for file in $(find . -mindepth 1 | egrep '\.(png|txt)$')
do
    echo -e "   \"$file\"\\"
done

Параметр mindepth пропускает текущий каталог. Я попытался переместить egrep в находку, в которой есть эта опция, но я не смог заставить ее работать.

Это даст вам несколько строк с отступом, оканчивающихся на \. Надеемся, что вы или кто-то еще можете заполнить остальные детали.

...