for filnamn in *.XXX; - Men även med underkataloger
for filnamn in *.XXX; - Men även med underkataloger
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...
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...
Home sweet ~/ = http://sandnabba.se
- uppsalanet
- Fadder
- Inlägg: 257
- Blev medlem: 29 sep 2008, 22:05
- OS: Ubuntu
- Utgåva: 24.04 Noble Numbat LTS
- Ort: Uppsala
Re: for filnamn in *.XXX; - Men även med underkataloger
Hej
Tll att börja med:
Sedan borde du kunna exempel:
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
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
Kod: Markera allt
for i in `find -name *.MOV`; do
{gör något med $i}
done
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
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:
Hur löser man det?
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
Home sweet ~/ = http://sandnabba.se
-
- Inlägg: 6191
- Blev medlem: 14 jan 2007, 19:31
- OS: Ubuntu
- Utgåva: 22.10 Kinetic Kudu
- Ort: Stockholm
Re: for filnamn in *.XXX; - Men även med underkataloger
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.
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
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
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
ǁ Q: Why is top posting so bad?
- uppsalanet
- Fadder
- Inlägg: 257
- Blev medlem: 29 sep 2008, 22:05
- OS: Ubuntu
- Utgåva: 24.04 Noble Numbat LTS
- Ort: Uppsala
Re: for filnamn in *.XXX; - Men även med underkataloger
Hej,
En lösning som jag tidigare använt mig av när filnamnen innehåller blank eller andra knasiga teckan:
Sedan kan du editera sub i find_mov.pl
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
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
Kod: Markera allt
sub wanted {
/^.*\.mov\z/s
&& print("$name\n");
}
//Fredrik
- Katt
- AVREGISTRERAD
- Inlägg: 625
- Blev medlem: 19 nov 2009, 11:04
- OS: Arch Linux
- Utgåva: 22.04 Jammy Jellyfish LTS
- Ort: Bohuslän
- Kontakt:
Re: for filnamn in *.XXX; - Men även med underkataloger
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
Det är inte lätt när det är svårt!
Re: for filnamn in *.XXX; - Men även med underkataloger
Jag var faktiskt först.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

http://ubuntu-se.org/phpBB3/viewtopic.p ... 87#p368761
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
ǁ Q: Why is top posting so bad?
- Katt
- AVREGISTRERAD
- Inlägg: 625
- Blev medlem: 19 nov 2009, 11:04
- OS: Arch Linux
- Utgåva: 22.04 Jammy Jellyfish LTS
- Ort: Bohuslän
- Kontakt:
Re: for filnamn in *.XXX; - Men även med underkataloger
Du skrev om det så elegant att jag missade det, ber om ursäkt

Det är inte lätt när det är svårt!
Re: for filnamn in *.XXX; - Men även med underkataloger
Nja, det vill tyvärr inte funka med citat tecken:
osv...
Eller är det något annat jag glömt?
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
Eller är det något annat jag glömt?
Home sweet ~/ = http://sandnabba.se
- Katt
- AVREGISTRERAD
- Inlägg: 625
- Blev medlem: 19 nov 2009, 11:04
- OS: Arch Linux
- Utgåva: 22.04 Jammy Jellyfish LTS
- Ort: Bohuslän
- Kontakt:
Re: for filnamn in *.XXX; - Men även med underkataloger
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
Det är inte lätt när det är svårt!
Re: for filnamn in *.XXX; - Men även med underkataloger
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:
Men filerna finns där:

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
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
Home sweet ~/ = http://sandnabba.se
- Katt
- AVREGISTRERAD
- Inlägg: 625
- Blev medlem: 19 nov 2009, 11:04
- OS: Arch Linux
- Utgåva: 22.04 Jammy Jellyfish LTS
- Ort: Bohuslän
- Kontakt:
Re: for filnamn in *.XXX; - Men även med underkataloger
Ingen aning varför det strular, men verkar ha med ls att göra, eftersom echo printar ut korrekt filnamn.
Det är inte lätt när det är svårt!
-
- Inlägg: 6191
- Blev medlem: 14 jan 2007, 19:31
- OS: Ubuntu
- Utgåva: 22.10 Kinetic Kudu
- Ort: Stockholm
Re: for filnamn in *.XXX; - Men även med underkataloger
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
Funkade inte. De första vart bra, men sen vart det kaos!?
Men det var förövrigt en intressant variabel!
Den ändrar alltså hur bash betér sig vid kontakt med blanksteg/nyrad osv?
Testade
Men det ville inte fungera.
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
Den ändrar alltså hur bash betér sig vid kontakt med blanksteg/nyrad osv?
Testade
Kod: Markera allt
IFS='\n'" ls /filnamn med/mellanrum/
Home sweet ~/ = http://sandnabba.se
- Katt
- AVREGISTRERAD
- Inlägg: 625
- Blev medlem: 19 nov 2009, 11:04
- OS: Arch Linux
- Utgåva: 22.04 Jammy Jellyfish LTS
- Ort: Bohuslän
- Kontakt:
Re: for filnamn in *.XXX; - Men även med underkataloger
Fungerar?
Kod: Markera allt
find . -name *.MOV -exec HandBrakeCLI -i {} -o {}/MOV/mkv -f mkv -e x264 -q 26 -E vorbis \;
Det är inte lätt när det är svårt!
-
- Inlägg: 6191
- Blev medlem: 14 jan 2007, 19:31
- OS: Ubuntu
- Utgåva: 22.10 Kinetic Kudu
- Ort: Stockholm
Re: for filnamn in *.XXX; - Men även med underkataloger
"The Internal Field Separator that is used for word splitting after expansion". Normalt är värdet <space><tab><newline>.Emil.s skrev:Den ändrar alltså hur bash betér sig vid kontakt med blanksteg/nyrad osv?
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
Test2 innehåller precis det du föreslog:
Kod: Markera allt
IFS='\n'
for filnamn in $(find -name *.MOV); do
echo $filnamn
done
Home sweet ~/ = http://sandnabba.se
-
- Inlägg: 6191
- Blev medlem: 14 jan 2007, 19:31
- OS: Ubuntu
- Utgåva: 22.10 Kinetic Kudu
- Ort: Stockholm
Re: for filnamn in *.XXX; - Men även med underkataloger
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"
- Katt
- AVREGISTRERAD
- Inlägg: 625
- Blev medlem: 19 nov 2009, 11:04
- OS: Arch Linux
- Utgåva: 22.04 Jammy Jellyfish LTS
- Ort: Bohuslän
- Kontakt:
Re: for filnamn in *.XXX; - Men även med underkataloger
Emil
fungerar perfekt, förutom när man ersätter echo med ls. Så har du testat de tidigare förslagen med handbrake kommandot?
dvs:
och
Kod: Markera allt
for filnamn in "`find -name *.MOV`"; do echo "$filnamn"; done
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
Kod: Markera allt
find . -name *.MOV -exec HandBrakeCLI -i {} -o {}/MOV/mkv -f mkv -e x264 -q 26 -E vorbis \;
Det är inte lätt när det är svårt!