Strona 1 z 1

[+] Bash - przekazywanie wielu nazw jednym parametrem

: 23 stycznia 2009, 14:30
autor: lis6502
Ludzi o bardziej światłych umysłach od mojego proszę o propozycje jak nazwać mój problem - mnie zabrakło inwencji.
Mam katalog w którym mam x plików.

Kod: Zaznacz cały

-rwxrwxrwx 1 lis6502 lis6502  72942 gru 31  2005 SnD - MagicTweak3.10kg.xm
-rwxrwxrwx 1 lis6502 lis6502  87456 mar 30  2006 SND - Nero v7 - All Product Keygen v1.0.xm
-rwxrwxrwx 1 lis6502 lis6502 399475 cze  4  2008 S.T.A.R.S. - ProxyCap 3.02crk.it
-rwxrwxrwx 1 lis6502 lis6502  12519 lip 30  2007 S.T.A.R.S. - Restorator All Versions Genericcrk.xm
-rwxrwxrwx 1 lis6502 lis6502  22860 wrz 23  2007 S.T.A.R.S. - Smart FTP 2.5crk.MOD
Na każdym z plików chcę wykonać xmp, a na pliku wynikowym lame, od biedy można to rozbić na dwie fazy. Problem pojawia się gdy piszę

Kod: Zaznacz cały

xmp * -o *.wav
Pliki niby są dekodowane, ale w efekcie powstaje mi plik o nazwie *.wav! Nie wiem jakim cudem to się dzieje, przecież * to znak zastrzeżony, tym niemniej

Kod: Zaznacz cały

-rw-r--r-- 1 lis6502 lis6502 63929292 sty 23 14:25 *.wav
się dzieje.
Próbowałem \*.wav, "*.wav", efekt zawsze ten sam.
Potrzebuję więc skrypt, który będzie przetwarzał pliki po kolei, ale potrzebuję wiedzieć jaki plik jest aktualnie przetwarzany, tzn jeśli aktualnie na widelcu mamy plik protracker.mod, to potrzebuję zmiennej, która przechowuję tę nazwę tak, aby

Kod: Zaznacz cały

zmiennaout="$zmienna .wav"
xmp $zmienna -o $zmiennaout
lame $zmiennaout
i tak w pętelce powiedzmy 2000 razy. Nasuwa mi się na myśl konstrukcja for...done, ale kompletnie nie mam pojęcia jak to zbudować.

: 23 stycznia 2009, 17:53
autor: Pies
Może przy pomocy ls stwórz plik z listą plików do edycji i potem odpalasz
skrypt < lista

a skrypt jest czymś w tym stylu:

Kod: Zaznacz cały

#!/bin/bash
while read plik
do
plikout=${plik}.wav ;
xmp $plik -o $plikout ;
lame $plikout ;
done

: 23 stycznia 2009, 20:51
autor: Utumno
ja uzywam do takich rzeczy skryptow Nautilusa. Na przyklad, jezeli w ~/.gnome2/nautilus-scripts/ umiescic skrypt

Kod: Zaznacz cały

#!/bin/sh

SIZE=100

mkdir ./thumbnails${SIZE}

until [ -z "$1" ]
do
  convert -strip -geometry ${SIZE}x${SIZE} -quality 80 "$1" ./thumbnails${SIZE}/${SIZE}_"$1"
  shift
done
i uczynic go wykonywalnym ( a potem restart nautilusa?), to mozna potem graficznie zmniejszac wiele zdjec naraz z poziomu Nautilusa w ten sposob, ze zaznaczamy je mysza , klikamy prawym -> skrypty -> wybierz nazwe tego skryptu.

Wystarczy lekko zmodyfikowac powyzsze o otrzymasz to co chcesz. Skrypt poprawnie radzi sobie z nazwami zawierajacymi spacje.

: 24 stycznia 2009, 02:06
autor: snah
Można też skorzystać z *, przykład znalazłem na stronie http://tldp.org/LDP/abs/html/loops1.html, numer 10-4.

Jako że jest dłuższy niż wydaje mi się potrzebne, nie będę go wklejał całego. Sedno sprawy:

Kod: Zaznacz cały

for file in *
do
  ls -l "$file"
done
lis6502 pisze:

Kod: Zaznacz cały

zmiennaout="$zmienna .wav"
xmp $zmienna -o $zmiennaout
lame $zmiennaout
To bym zrobił tak:

Kod: Zaznacz cały

xmp $zmienna -o $zmienna.wav
lame $zmienna.wav
Ewentualnie z jakimiś {} czy też "", żeby oddzielić .wav - dla przejrzystości kodu.

: 24 stycznia 2009, 05:17
autor: lis6502
Wow, nie sądziłem że mój temat spotka się z takim odezwem :) . Dziękuję Utumno, ale nie korzystam z Gnome'a, a sam pomysł takiego skryptu przydałby się 'przenośny'; czasem zachodzi potrzeba wykonania kilku operacji na jednym pliku w trybie mocno okrojonego systemu. Tym niemniej wciąż zaskakują mnie możliwości Linuksowych przeglądarek plików. Pokombinuję i dam znać.

[ Dodano: 2009-01-24, 08:18 ]
Haha, ludziki uśmiejecie się

Kod: Zaznacz cały

Dr. Pc Putte - AnyDVD 6.1.5.1 Betacrk_1.xm <-ten plik aktualnie idzie
Extended Module Player 2.5.1 Fri Dec  7 09:58:06 BRST 2007
Copyright (C) 1996-2007 Claudio Matsuoka and Hipolito Carraro Jr
Using file: Dr.
Mixer set to 16bit, 44100 Hz, interpolated stereo
xmp: Dr.: unrecognized file format
xmp: Pc: No such file or directory
xmp: Putte: No such file or directory
xmp: -: No such file or directory
xmp: AnyDVD: No such file or directory
xmp: 6.1.5.1: No such file or directory
xmp: Betacrk_1.xm: No such file or directory
xmp: Pc: No such file or directory
xmp: Putte: No such file or directory
xmp: -: No such file or directory
xmp: AnyDVD: No such file or directory
xmp: 6.1.5.1: No such file or directory
xmp: Betacrk_1.xm.wav: No such file or directory
:-P Na to wychodzi że każdą ' ' trzeba zamienić na '\ '. O'rany, takich jaj nie uświadczyłem od czasu instalacji wifi ;) .

[ Dodano: 2009-01-24, 08:48 ]
Nakreśliłem węża do seda, o takiego

Kod: Zaznacz cały

sed 's/ /\\ /g'
Piękne, nie? :-P. W każdym razie, problem z tym jest taki: jak puszczam to w takiej formie

Kod: Zaznacz cały

echo $file |sed 's/ /\\ /g'
wynik jest oczekiwany, czyli
SnD\ -\ Invisible\ Browsing\ 6.0crk.xm
Jak dla mnie bomba. Natomiast jeśli zamykam to do zmiennej na przykład o tak:

Kod: Zaznacz cały

dłoń=`echo $file |sed 's/ /\\ /g'`
to bash moje ciężko pozamieniane '\ ' przerabia spowrotem na ' '. Argh. Jest jakieś bardziej eleganckie rozwiązanie niż przekierowanie wyjścia z sed'a do pliku i czytanie go później?

[ Dodano: 2009-01-24, 08:58 ]
Poddaje się.
Wynik działania skryptu

Kod: Zaznacz cały

Extended Module Player 2.5.1 Fri Dec  7 09:58:06 BRST 2007
Copyright (C) 1996-2007 Claudio Matsuoka and Hipolito Carraro Jr
Using file: Serials\
Mixer set to 16bit, 44100 Hz, interpolated stereo
xmp: Serials\: unrecognized file format
xmp: 2k\: No such file or directory
xmp: 6.0.mod: No such file or directory
xmp: 2k\: No such file or directory
xmp: 6.0.mod.wav: No such file or directory
xmp: invalid option -- \
xmp: invalid option -- \
xmp: invalid option -- \
xmp: invalid option -- \
xmp: invalid option -- \
xmp: invalid option -- \
Sam skrypt

Kod: Zaznacz cały

#!/bin/bash
for file in * 
 do 
echo $file |sed 's/ /\\ /g' >/tmp/dłoń

xmp $(cat /tmp/dłoń) -o $(cat /tmp/dłoń).wav

 done
To samo w konsoli

Kod: Zaznacz cały

lis6502@Nexus:~/Desktop/New Folder$ xmp S.T.A.R.S.\ -\ ProxyCap\ 3.02crk.it
Extended Module Player 2.5.1 Fri Dec  7 09:58:06 BRST 2007
Copyright (C) 1996-2007 Claudio Matsuoka and Hipolito Carraro Jr
Using OSS PCM audio [8 fragments of 4116 bytes]
Mixer set to 16bit, 44100 Hz, interpolated stereo
Loading S.T.A.R.S. - ProxyCap 3.02crk.it... (1 of 1)
Module title   : Crack by ValdikSS
Module type    : IMPM 2.14 (ModPlug Tracker 1.16)
Module length  : 19 patterns
Instr/FX mode  : new/IT
Instruments    : 7 .......
Stored Samples : 90 ................
Stored Patterns: 15 ...............
Channels       : 9 [ 8 8 8 8 8 8 8 8 8 ]
Estimated time : 1min16s
Elapsed time   : 1min16s
Channels used  : 15/9, avg 9.83 (109.2%)
Jaka jest różnica? Chyba wytnę wszystkie spacje w nazwach :evil:.

: 24 stycznia 2009, 10:09
autor: snah
Zasadniczo "$file" powinno pomóc, bez żadnych \. U mnie jest tak:

Kod: Zaznacz cały

$ for file in r*; do xmp $file; done
Extended Module Player 2.5.1 Fri Dec  7 09:58:06 BRST 2007
Copyright (C) 1996-2007 Claudio Matsuoka and Hipolito Carraro Jr
Using OSS PCM audio [16 fragments of 4096 bytes]
Mixer set to 16bit, 44100 Hz, interpolated stereo
Loading raz... (1 of 3)
xmp: raz: No such file or directory

Loading dwa... (2 of 3)
xmp: dwa: No such file or directory

Loading trzy... (3 of 3)
xmp: trzy: No such file or directory

Kod: Zaznacz cały

$ for file in r*; do xmp "$file"; done
Extended Module Player 2.5.1 Fri Dec  7 09:58:06 BRST 2007
Copyright (C) 1996-2007 Claudio Matsuoka and Hipolito Carraro Jr
Using OSS PCM audio [16 fragments of 4096 bytes]
Mixer set to 16bit, 44100 Hz, interpolated stereo
Loading raz dwa trzy... (1 of 1)
xmp: raz dwa trzy: unrecognized file format

Kod: Zaznacz cały

$ xmp raz\ dwa\ trzy
Extended Module Player 2.5.1 Fri Dec  7 09:58:06 BRST 2007
Copyright (C) 1996-2007 Claudio Matsuoka and Hipolito Carraro Jr
Using OSS PCM audio [16 fragments of 4096 bytes]
Mixer set to 16bit, 44100 Hz, interpolated stereo
Loading raz dwa trzy... (1 of 1)
xmp: raz dwa trzy: unrecognized file format

: 24 stycznia 2009, 12:16
autor: Inquistor
Może ten skrypt Cie jakoś nakieruje na swoje rozwiazanie:

-> http://debian.linux.pl/viewtopic.php?t=12317

: 24 stycznia 2009, 14:06
autor: Pies
A może po prostu cudzysłowy?
#!/bin/bash
for file in *
do
xmp "${file}" -o "${file}.wav"
done
Może to podziała? Na xmp sprawdzić nie mogę, ale w innych poleceniach poprawnie interpretuje spacje.

: 24 stycznia 2009, 21:50
autor: lis6502
Bardzo dziękuję panowie. Okazuje się, że sam xmp jest niedopracowany na tyle, że Wasze pomysły wykorzystam jedynie przy kompresowaniu wave'ów do mp3. Czasem dekoduje mod'a, ale w efekcie zapełnia tylko pamięć, a potem zaczyna nałogowo mielić swapem. Inquisitor Twój sposób też ciekawy, mam nadzieję że mój wątek rzucił trochę światła i na Twój problem.
Edit: aha, żeby nie było, cudzysłowy rozwiązały problem spacji w nazwach.
Problem całkowicie rozwiązany. Wszystkim którzy mają podobne gusta muzyczne jak ja, polecam umodplayer. Bazuje on na modplugu Oliviera, dzięki czemu radzi sobie całkiem znośnie z wariantami różnych trackerów. No i, działa w połączeniu z lame ^^.