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

Här diskuteras programmering och utveckling
Emil.s
Inlägg: 6633
Blev medlem: 12 dec 2006, 23:20
OS: Ubuntu
Ort: /Dalarna/Hedemora/
Kontakt:

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

Inlägg 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...
Home sweet ~/ = http://sandnabba.se
Användarvisningsbild
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

Inlägg 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
Emil.s
Inlägg: 6633
Blev medlem: 12 dec 2006, 23:20
OS: Ubuntu
Ort: /Dalarna/Hedemora/
Kontakt:

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

Inlägg 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?
Home sweet ~/ = http://sandnabba.se
Lars
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

Inlägg 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.
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

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

Inlägg 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
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
Användarvisningsbild
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

Inlägg 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
Användarvisningsbild
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

Inlägg 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
Det är inte lätt när det är svårt!
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

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

Inlägg 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
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
Användarvisningsbild
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

Inlägg 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 :)
Det är inte lätt när det är svårt!
Emil.s
Inlägg: 6633
Blev medlem: 12 dec 2006, 23:20
OS: Ubuntu
Ort: /Dalarna/Hedemora/
Kontakt:

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

Inlägg 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?
Home sweet ~/ = http://sandnabba.se
Användarvisningsbild
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

Inlägg 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
Det är inte lätt när det är svårt!
Emil.s
Inlägg: 6633
Blev medlem: 12 dec 2006, 23:20
OS: Ubuntu
Ort: /Dalarna/Hedemora/
Kontakt:

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

Inlägg 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
Home sweet ~/ = http://sandnabba.se
Användarvisningsbild
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

Inlägg av Katt »

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!
Lars
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

Inlägg 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
Emil.s
Inlägg: 6633
Blev medlem: 12 dec 2006, 23:20
OS: Ubuntu
Ort: /Dalarna/Hedemora/
Kontakt:

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

Inlägg 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.
Home sweet ~/ = http://sandnabba.se
Användarvisningsbild
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

Inlägg av Katt »

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!
Lars
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

Inlägg 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 ;)
Emil.s
Inlägg: 6633
Blev medlem: 12 dec 2006, 23:20
OS: Ubuntu
Ort: /Dalarna/Hedemora/
Kontakt:

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

Inlägg 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
Home sweet ~/ = http://sandnabba.se
Lars
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

Inlägg 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"
Användarvisningsbild
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

Inlägg 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 \;
Det är inte lätt när det är svårt!
Skriv svar

Återgå till "Programmering och webbdesign"