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.


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_

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.