Przetwarzanie wsadowe dwóch zestawów plików

3

Załóżmy, że mam dwa zestawy plików foo_A_uid.bar i foo_B_uid.bar. Każdy zestaw zawiera (znaną) liczbę plików. Teraz chcę przetworzyć odpowiednie pary za pomocą jakiegoś narzędzia ( ImageMagick w moim przypadku), to chcę uciekać some_command foo_A_i.bar foo_B_i.bar out_i.bar, gdzie out_i.bar jest wynikiem / wynikiem podczas uruchamiania narzędzia na parze foo_A_i.bar i foo_B_i.bar dla niektórych naprawione i.

Moje pytanie brzmi: jak mogę wsadować ten proces? Trochę python, bash scenariusz?

Wyjaśnienie: Przez zbiór plików rozumiem listę plików, wszystkie zaczynają się od tego samego początkowego, potem trochę UID i mają to samo rozszerzenie. To zatrzymanie dla obu zestawów wejściowych i wyjścia.

Dror
źródło
1
Kiedy mówisz „zestawy plików”, masz na myśli pliki tekstowe zawierające listy plików? Czy więc „foo_A_i.bar” ​​oznacza „i-wiersz w pliku foo_A_i.bar”? Jeśli tak jest, możesz użyć polecenia unix „wklej”, aby połączyć dwa pliki obok siebie. A jeśli nie to masz na myśli, nie rozumiem tego.
Paul Richter
Przez „zestaw plików” mam na myśli to, że mam dwa zestawy, każdy zawiera taką samą liczbę plików. Każdy element jednego z zestawów jest plikiem - .png w moim przypadku.
Dror
Jak długo są te pliki? Czy obie listy nazw łatwo zmieszczą się w pamięci RAM? Czy istnieją nazwy plików zawierające spacje i inne, nietypowe znaki, takie jak tab, line feed, feed strony i tak dalej?
user unknown
Pliki w moim przypadku są plikami binarnymi ...
Dror
Byłem zdezorientowany, ponieważ z nazw stylów „foo bar” nie wynika jasno, czy „foo_A_uid.bar” ​​był plikiem tekstowym zawierającym nazwy plików (które zakładam, że jest), czy na przykład katalog zawierający pliki. Znacznie wyraźniej jest użyć nazwy takiej jak „file_list_A.txt” dla „zestawu” i „image_A_01.png” dla pliku docelowego.
Paul Richter

Odpowiedzi:

1

Oto możliwe rozwiązanie, które działa, chociaż nie wiem, czy jest dobre.

#!/bin/bash

EXPECTED_ARGS=3
E_BADARGS=65

if [ $# -ne $EXPECTED_ARGS ]
then
    echo Not the right number of arguments
    exit $E_BADARGS
fi

for i in $( ls $1* ); do
    TMP=$(echo $2$(echo $i | cut -d'_' -f2))
    TMP2=$(echo $3$(echo $i | cut -d'_' -f2))
    convert $i $TMP +append $TMP2
done

Uruchamianie powinno wyglądać następująco:

script foo_A_ foo_B_ out_
Dror
źródło
0
#!/bin/bash
count=$(wc -l foo_A_uid.bar)
for line in $(seq 1 ${count/ */})
do
    aline=$(sed -n $line"p" foo_A_uid.bar)
    bline=$(sed -n $line"p" foo_A_uid.bar)
    yourcommand "$aline" "$bline"
done

Zakładając, że oba pliki są posortowane, linia licząca pobiera liczbę linii w pliku a. Następnie pętla przechodzi przez wszystkie wartości z 1..count. Zmienna count zawiera nazwę pliku, który jest odcięty ${count/ */}. Z sed otrzymujesz tę samą linię z obu plików. -n oznacza „brak drukowania domyślnie”, $ wiersz „p” będzie wtedy po prostu drukować linię $ wiersz.

user unknown
źródło