Как получить массив файлов .png в папке с помощью Bash - PullRequest
4 голосов
/ 22 июня 2010

Привет, я новичок в программировании Bash и мне нужна помощь.Я строю конвейер для обработки изображений.Я хотел бы иметь возможность взять изображения PNG в папке и передать их в clusterImage.pl, как только это будет сделано. Я хотел бы затем передать полученный файл в seperateObjects.pl полученный файл с тем же именем, но имеет kmeansOutput.all.matrix прикреплен к концу.Ниже то, что у меня есть, но оно не работает.Любая помощь будет принята с благодарностью.Спасибо

#!/bin/bash
#This script will take in an image and a matrix file.
#The output will be an image and a matrix file.

list=`ls *.png`
for i in $list
do
$file="./$list"
$image_array = $list
echo $file
#Cheching to see if the file exists.
for((j=0;j<=i;j++))
do
if [ -e image_array[j] ]; then
echo $file
echo "Begining processing"
#Take in an image and create a matrix from it.
perl clusterImage.pl SampleImage.png
#Take in a matrix and draw a picture showing the centers of all
#of the colonies.
perl seperateObjects.pl SampleImage.png.kmeansOutput.all.matrix
echo "Ending processing"
else
echo "There is an issue"
fi
done
done

Ответы [ 4 ]

7 голосов
/ 22 июня 2010

это должно работать:

for file in *.png; do
    # do stuff with your file:
    perl clusterImage.pl "$file";
    # …
done
4 голосов
/ 22 июня 2010

Я вижу несколько проблем (или потенциальных улучшений) с вашим кодом:

  1. Вам не нужен цикл for i in $list, потому что вы никогда не используете $i в скрипте - это приводит к тому, что вы делаете одно и то же снова и снова (столько же раз, сколько и файлов .png в каталоге)
  2. Вам не нужно использовать массив Bash, поскольку Bash может перебирать различные имена файлов в списке, например *.png.
  3. Я подозреваю, что вы хотите запустить perl clusterImage.pl для каждого .png файла в каталоге ... или вы? Трудно сказать. Измените свой вопрос, чтобы более четко объяснить, что вы хотите сделать, и я могу соответственно отредактировать свой ответ.
  4. Вы можете использовать короткое замыкание, как они его называют, вместо оператора if: [ -f file.png ] && echo "file exists" короче

    if [ -f file.png ]; then
        echo "file exists"
    fi
    

Если я понимаю, что вы пытаетесь сделать (и я не уверен, что понимаю), я думаю, это может сработать для вас. Для каждого изображения в каталоге будет выполняться perl clusterImage.pl <name_of_image.png> и perl separateObjects.pl <name_of_image.png>.kmeansOutput.all.matrix.

for image in *.png
do
  [[ -f $image ]] && perl clusterImage.pl $image && perl separateObjects.pl $image.kmeansOutput.all.matrix
done
1 голос
/ 22 июня 2010

Обычно вы не хотите, чтобы в именах переменных слева от присвоения были знаки доллара.

Вы могли бы создать такой массив: image_array=($(ls *.png)), но этопроисходит сбой, если в именах файлов есть пробелы.

Не анализировать ls, хотя, по крайней мере, по этой причине.

Не использовать обратные галочки, используйте $().

Вы вложили циклы, которые, кажется, конфликтуют друг с другом.Структура в knittl's answer - это та, которую вы должны использовать.

1 голос
/ 22 июня 2010

Если вы действительно хотите иметь массив, это возможно: Расширенное руководство по написанию сценариев Bash: массивы

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

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