Sida 1 av 2

for filnamn in *.XXX; - Men även med underkataloger

Postat: 31 jan 2010, 14:16
av Emil.s
Kör i dagsläget denna rad för att konvertera film från kameran till ett mer hanterbart format:
for filnamn in *.MOV; do HandBrakeCLI -i $filnamn -o ${filnamn/MOV/mkv} -f mkv -e x264 -q 26 -E vorbis; done

Problemet är ju att man lär ställa sig i katalogen där filerna finns för att det ska funka.
Skulle vilja göra det i rooten på en katalog, och den kör kommandot på samtliga underkataloger.

Antar att find är lösningen:
"find -name *.MOV"

Har testat att lägga till -exec med diverse variabler, men får det inte att funka...

Re: for filnamn in *.XXX; - Men även med underkataloger

Postat: 31 jan 2010, 14:49
av uppsalanet
Hej
Tll att börja med:

Kod: Markera allt

for filnamn in `ls /path/to/folder/*.MOV`; do 
HandBrakeCLI -i $filnamn -o ${filnamn/MOV/mkv} -f mkv -e x264 -q 26 -E vorbis
done
Sedan borde du kunna exempel:

Kod: Markera allt

for i in `find -name *.MOV`; do
{gör något med $i}
done
Du kan ju alltid ha en for loop i en for loop om du förstår vad jag menar.

Kanske kan det ge dig en hänvisning i rätt rikning. Hör av dig om inte...

//Fredrik

Re: for filnamn in *.XXX; - Men även med underkataloger

Postat: 01 feb 2010, 12:27
av Emil.s
Tackar!

Den senare borde funka bra. Dock så blir ju outputen i stil med "./Sandnabbas bilder/BGBV/P1000476.MOV".

Problemet är blanksteget i Sandnabbas bilder. Kör man något kommando mot filerna då så blir det ju typ:

Kod: Markera allt

ls: cannot access ./Sandnabbas: No such file or directory
ls: cannot access bilder/BGBV/P1000477.MOV: No such file or directory
Hur löser man det?

Re: for filnamn in *.XXX; - Men även med underkataloger

Postat: 01 feb 2010, 13:18
av Lars
Du har två problem att handskas med. Det ena är att for-slingan inte fungerar för filnamn med mellanslag. Det löser man bäst genom att använda -exec. Men det leder till ett annat problem, nämligen att -exec inte förstår syntaxen ${filnamn/MOV/mkv}.

Du kanske kan skriva ett litet skript som endast tar ett argument och kör HandBrakeCLI på det filnamnet. Det kan du sedan köra från -exec.

Re: for filnamn in *.XXX; - Men även med underkataloger

Postat: 01 feb 2010, 14:07
av dmz

Kod: Markera allt

» for x in $(seq 0 3);do  touch file\ $x.mov; done; ls            
total 0
-rw-r--r-- 1 scp1 0 Feb  1 13:06 file 0.mov
-rw-r--r-- 1 scp1 0 Feb  1 13:06 file 1.mov
-rw-r--r-- 1 scp1 0 Feb  1 13:06 file 2.mov
-rw-r--r-- 1 scp1 0 Feb  1 13:06 file 3.mov

Kod: Markera allt

» for x in *.mov; do touch "new file $x"; done; ls    
total 0
-rw-r--r-- 1 scp1 0 Feb  1 13:06 file 0.mov
-rw-r--r-- 1 scp1 0 Feb  1 13:06 file 1.mov
-rw-r--r-- 1 scp1 0 Feb  1 13:06 file 2.mov
-rw-r--r-- 1 scp1 0 Feb  1 13:06 file 3.mov
-rw-r--r-- 1 scp1 0 Feb  1 13:06 new file file 0.mov
-rw-r--r-- 1 scp1 0 Feb  1 13:06 new file file 1.mov
-rw-r--r-- 1 scp1 0 Feb  1 13:06 new file file 2.mov
-rw-r--r-- 1 scp1 0 Feb  1 13:06 new file file 3.mov

Re: for filnamn in *.XXX; - Men även med underkataloger

Postat: 01 feb 2010, 21:09
av uppsalanet
Hej,
En lösning som jag tidigare använt mig av när filnamnen innehåller blank eller andra knasiga teckan:

Kod: Markera allt

find2perl / -name \*.mov > find_mov.pl
Sedan kan du editera sub i find_mov.pl

Kod: Markera allt

sub wanted {
    /^.*\.mov\z/s
    && print("$name\n");
}
Jag tror säkert att den kommer gnälla lite när du sedan kör perl find_mov.pl om man inte är admin.


//Fredrik

Re: for filnamn in *.XXX; - Men även med underkataloger

Postat: 02 feb 2010, 11:07
av Katt
Fungerar det inte med situationstecken?

Kod: Markera allt

for filnamn in `find . -name *.MOV`; do
HandBrakeCLI -i "$ifilnamn" -o "${filnamn/MOV/mkv}" -f mkv -e x264 -q 26 -E vorbis
done

Re: for filnamn in *.XXX; - Men även med underkataloger

Postat: 02 feb 2010, 11:14
av dmz
Katt skrev:Fungerar det inte med situationstecken?

Kod: Markera allt

for filnamn in `find . -name *.MOV`; do
HandBrakeCLI -i "$ifilnamn" -o "${filnamn/MOV/mkv}" -f mkv -e x264 -q 26 -E vorbis
done
Jag var faktiskt först. :(
http://ubuntu-se.org/phpBB3/viewtopic.p ... 87#p368761

Re: for filnamn in *.XXX; - Men även med underkataloger

Postat: 02 feb 2010, 16:32
av Katt
dmz skrev: Jag var faktiskt först. :(
http://ubuntu-se.org/phpBB3/viewtopic.p ... 87#p368761
Du skrev om det så elegant att jag missade det, ber om ursäkt :)

Re: for filnamn in *.XXX; - Men även med underkataloger

Postat: 05 feb 2010, 23:10
av Emil.s
Nja, det vill tyvärr inte funka med citat tecken:

Kod: Markera allt

for filnamn in `find . -name *.MOV`; do
ls -l "$filnamn"
done

Kod: Markera allt

ls: cannot access ./Sandnabbas: No such file or directory
ls: cannot access bilder/BGBV/P1000477.MOV: No such file or directory
osv...

Eller är det något annat jag glömt?

Re: for filnamn in *.XXX; - Men även med underkataloger

Postat: 06 feb 2010, 01:32
av Katt
Ber om ursäkt, missade två situationstecken i koden, de skall vara kring find kommandot så att inte både Sandnabba och bilder sparas som var sin variabel i filnamn. dvs:

Kod: Markera allt

for filnamn in "`find . -name *.MOV`"; do 
HandBrakeCLI -i "$ifilnamn" -o "${filnamn/MOV/mkv}" -f mkv -e x264 -q 26 -E vorbis
done

Re: for filnamn in *.XXX; - Men även med underkataloger

Postat: 06 feb 2010, 17:30
av Emil.s
Sådär ja. Nu börjar det likna något. Tackar! :)

Bara en liten detalj kvar... Första och sista filen verkar inte vilja hänga med:

Kod: Markera allt

emil@Sandnabba: /filer/multimedia/Bilder/Lumpen $> ./test.sh 
ls: cannot access ./Sandnabbas bilder/P1040385.MOV
./Sandnabbas bilder/P1040394.MOV
.....
.....
.....
./Sandnabbas bilder/IMG_0197.MOV
./Sandnabbas bilder/IMG_0226.MOV: No such file or directory
Men filerna finns där:

Kod: Markera allt

emil@Sandnabba: /filer/multimedia/Bilder/Lumpen $> ls -l "./Sandnabbas bilder/IMG_0226.MOV"
-rw-rwx---+ 1 emil emil 8473879 2010-01-25 15:11 ./Sandnabbas bilder/IMG_0226.MOV

Re: for filnamn in *.XXX; - Men även med underkataloger

Postat: 06 feb 2010, 22:43
av Katt
Ingen aning varför det strular, men verkar ha med ls att göra, eftersom echo printar ut korrekt filnamn.

Re: for filnamn in *.XXX; - Men även med underkataloger

Postat: 06 feb 2010, 23:59
av Lars
Kommandot find skriver ju ut varje filnamn på en rad. Men problemet med for-slingan är att den bryter både på mellanslag OCH nyradstecken. Det är därför olika delar av filnamnet hamnar i olika varv av slingan. Man kan ändra det här beteendet genom att ändra på variabeln IFS, så här:

Kod: Markera allt

IFS='\n'
for filnamn in $(find -name *.MOV); do
    echo $filnamn
done

Re: for filnamn in *.XXX; - Men även med underkataloger

Postat: 07 feb 2010, 00:13
av Emil.s
Funkade inte. De första vart bra, men sen vart det kaos!?

Kod: Markera allt

emil@Sandnabba: ~/filer/multimedia/Bilder/Lumpen $> ./test2.sh 
./XXX bilder/P1040385.MOV
./XXX bilder/P1040394.MOV
./Sa
d
abbas bilder/BGBV/Motorsåg/P1000464.MOV
./Sa
d
abbas bilder/BGBV/Motorsåg/P1000469.MOV
Men det var förövrigt en intressant variabel!
Den ändrar alltså hur bash betér sig vid kontakt med blanksteg/nyrad osv?

Testade

Kod: Markera allt

IFS='\n'" ls /filnamn med/mellanrum/
Men det ville inte fungera.

Re: for filnamn in *.XXX; - Men även med underkataloger

Postat: 07 feb 2010, 01:11
av Katt
Fungerar?

Kod: Markera allt

find . -name *.MOV -exec HandBrakeCLI -i {} -o {}/MOV/mkv -f mkv -e x264 -q 26 -E vorbis \;

Re: for filnamn in *.XXX; - Men även med underkataloger

Postat: 07 feb 2010, 01:40
av Lars
Emil.s skrev:Den ändrar alltså hur bash betér sig vid kontakt med blanksteg/nyrad osv?
"The Internal Field Separator that is used for word splitting after expansion". Normalt är värdet <space><tab><newline>.

Det här är ungefär vad som händer när du kör for filnamn in $(find . *.MOV):
1) Kommandot find . .*MOV körs och expanderas till typ:
./XXX bilder/P1040385.MOV
./XXX bilder/P1040394.MOV
2) "word splitting" sker med hjälp av IFS, d.v.s. texten delas vid mellanslag, tabb och nyradstecken. Resultatet blir fyra "ord":
./XXX
bilder/P1040385.MOV
./XXX
bilder/P1040394.MOV
3) Slingan körs för var och ett av de fyra "orden"

Om du använder IFS='\n' så kommer ovanstående endast att delas upp i två "ord", precis som du vill ha det. Men det är lite svårt att veta vad som är fel när du bara avslöjar att du kör ./test2.sh ;)

Re: for filnamn in *.XXX; - Men även med underkataloger

Postat: 07 feb 2010, 03:01
av Emil.s
Test2 innehåller precis det du föreslog:

Kod: Markera allt

IFS='\n'
for filnamn in $(find -name *.MOV); do
    echo $filnamn
done

Re: for filnamn in *.XXX; - Men även med underkataloger

Postat: 07 feb 2010, 10:17
av Lars
Usch, bash är en märkligt programmeringsspråk som inte alltid gör vad man vill. IFS='\n' gör ju inte alls vad jag trodde. Så här gör man för att få enbart ett nyradstecken i $IFS:

Kod: Markera allt

OLDIFS="$IFS"
IFS='
'
for filnamn in $(find -name *.MOV); do
    echo $filnamn
done
IFS="$OLDIFS"

Re: for filnamn in *.XXX; - Men även med underkataloger

Postat: 07 feb 2010, 10:52
av Katt
Emil

Kod: Markera allt

 for filnamn in "`find -name *.MOV`"; do echo "$filnamn"; done
fungerar perfekt, förutom när man ersätter echo med ls. Så har du testat de tidigare förslagen med handbrake kommandot?
dvs:

Kod: Markera allt

for filnamn in "`find . -name *.MOV`"; do
HandBrakeCLI -i "$ifilnamn" -o "${filnamn}/MOV/mkv" -f mkv -e x264 -q 26 -E vorbis
done
och

Kod: Markera allt

find . -name *.MOV -exec HandBrakeCLI -i {} -o {}/MOV/mkv -f mkv -e x264 -q 26 -E vorbis \;