Mam folder z wieloma plikami (xyz1, xyz2, aż do xyz5025) i muszę uruchomić skrypt na każdym z nich, otrzymując xyz1.faa, xyz2.faa i tak dalej jako dane wyjściowe.
Polecenie dla pojedynczego pliku to:
./transeq xyz1 xyz1.faa -table 11
Czy istnieje sposób, aby to zrobić automatycznie? Może kombinacja for-do?
for file in xyz*; do ./transeq "$file" "${file}.faa" -table 11; done
. Cały czas piszę takie rzeczy. A jeśli chcesz sprawdzić, czy nazwy plików itp. Są rozwijane tak, jak chcesz, po prostuecho
podo
raz pierwszy umieść poprawkę, a następnie wróć do historii powłoki i usuń ją po raz drugi."$file".faa
jest nieco łatwiejszy do wpisania jako część interaktywnej jednowierszowej i jest bezpieczny, ponieważ.faa
nie zawiera żadnych metaznaków powłoki, które należy cytować.xyz*
glob również pobierze pliki .faa. Aby uruchomić bash, uruchomshopt -s extglob
( odwołanie ), a następnie użyj,for file in xyz!(*.faa) ...
aby wykluczyć wysyłanie plików .faa przez pętlę.Jeśli zainstalujesz GNU Parallel , możesz to zrobić równolegle w następujący sposób:
Jeśli program intensywnie wykorzystuje procesor, powinien znacznie przyspieszyć.
źródło
Możesz zrobić coś takiego w
bash
wierszu poleceń:Generujemy liczby całkowite od 1 do 5025, jeden / wiersz, a następnie podajemy je jeden po drugim do xargs, który hermetyzuje liczbę całkowitą do,
{}
a następnie transplantuje ją do wiersza poleceń ./transeq w odpowiedni sposób.Jeśli nie masz funkcji rozwijania nawiasów klamrowych,
{n..m}
możesz wywołaćseq
narzędzie do wygenerowania tych liczb.Lub zawsze możesz emulować generowanie liczb za pomocą:
źródło
for i in {1..5025}; do ./transeq "xyz$i" "xyz$i".faa -table 11; done
jest o wiele łatwiejsze do myślenia i pisania. Jeśli chcesz, aby drukował polecenia przed ich wykonaniem, użyjset -x
.for i in
{1..5025}
osiągnąć dokładnie taki sam wynik jak twój. Możesz także pisaćfor ((i=1 ; i<=5025 ; i++)); do ./transeq "xyz$i" "xyz$i".faa -table 11; done
bash, ale zwykle używam{a..b}
składni zakresu, ponieważ szybciej jest pisać.Za pomocą funkcji znajdź przydatnej, gdy pliki są rozproszone w katalogach
źródło
Zakładając, że masz więcej niż jeden rdzeń i każde wywołanie może działać niezależnie od reszty, zyskasz całkiem przyspieszenie dzięki równoległym biegom.
Względnie prosty sposób to zrobić za pomocą
-P
parametruxargs
- na przykład, jeśli masz 4 rdzenie:-n 1
Mówixargs
wybrać tylko jeden argument z listy dla każdej inwokacji (domyślnie byłoby przekazać mnóstwo) , a-P 4
mówi się na tarło 4 procesów w tym samym czasie - gdy ktoś umiera, jest nowy zrodził.IMHO, nie musisz instalować GNU równolegle dla tej prostej skrzynki -
xargs
wystarczy.źródło
Możesz użyć
xarg
ls | xargs -L 1 -d '\n' your-desired-command
-L 1
powoduje przejście 1 przedmiotu na raz-d '\n'
make wyjściels
jest podzielone na podstawie nowej linii.źródło