Bash - Problem när jag skapar en lista med find av filmer som innehåller mellanslag

Trädvy Permalänk
Medlem
Plats
Falun
Registrerad
Okt 2001

Bash - Problem när jag skapar en lista med find av filmer som innehåller mellanslag

Hej
Jag sitter och pillar med ett bash-skript där jag ska lista filmer i en viss katalog.
Jag använder find på detta sätt för att skapa en lista i en variabel

LIST=`find "$DIR" -iregex ".*\(mpg\|avi\)$"`

Problemet blir när jag sedan ska dela upp listan och behandla den. Jag använder då en for-loop:

for i in $LIST; do XINE+="mrl=\"$i\"," done

Resultatet blir att vid varje nytt mellanslag så (tex i filnamn) så gör for-loopen en ny sak.

Någon som vet hur jag ska lösa problemet?

Kanske det går att lägga in sökresultaten i en vektor? typ:
find "$DIR" -iregex ".*\(mpg\|avi\)$" -exec vektornånting

MVH Niclas

Har bytt namn från: nulleman ~ Blogg: http://skorpion.se
MacBook Pro: 15.4' ~ 1.83GHz ~ 1512MB RAM ~ 80GB HDD
Medlem i signaturen blodtörstiga Appleanvändare

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Okt 2006

noll terminera listan istället med -print0 och kör kommandon på den lista som skapas automatiskt med xargs som har en -0 option för noll terminerade listor..

"Stallman to Dvorak: Welcome to freedom, your rulebook is in the mail" - Fake Steve Jobs
rfc-1925 - The Twelve Networking Truths

Trädvy Permalänk
Medlem
Plats
Falun
Registrerad
Okt 2001

Tack, men jag förstod inte riktigt hela förklaringen. Det med -print0 förstod jag, men inte det andra med xargs
Kan du ge något exempel?
Hur får jag in det där med xargs i min foor-loop?

/Niclas

Har bytt namn från: nulleman ~ Blogg: http://skorpion.se
MacBook Pro: 15.4' ~ 1.83GHz ~ 1512MB RAM ~ 80GB HDD
Medlem i signaturen blodtörstiga Appleanvändare

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Okt 2006

Det beror helt på vad du vill göra, jag kan varmt rekomendera manualen för xargs.. Annars är det ju trivialt att temporärt ersätta alla mellanslag för loopen.

"Stallman to Dvorak: Welcome to freedom, your rulebook is in the mail" - Fake Steve Jobs
rfc-1925 - The Twelve Networking Truths

Trädvy Permalänk
Medlem
Plats
Falun
Registrerad
Okt 2001

Tack för den hinten, kom å tänka på tr så det blev å trixa lite med det. Var mycket enklare. Nu funkar det bra

/Niclas

Har bytt namn från: nulleman ~ Blogg: http://skorpion.se
MacBook Pro: 15.4' ~ 1.83GHz ~ 1512MB RAM ~ 80GB HDD
Medlem i signaturen blodtörstiga Appleanvändare

Trädvy Permalänk
Medlem
Plats
vänster om atom 276
Registrerad
Jul 2001

while read -d '' line; do list+=("$line"); done < <(find "$DIR" -iregex ".*\(mpg\|avi\)$" -print0) printf "%s\n" "${list[@]}"

Snyggare lösning, ha det så kul.

Edit:
Eller det kanske var detta du ville uppnå:

while read -d '' line; do list+=("$line"); done < <(find "$DIR" -iregex ".*\(mpg\|avi\)$" -print0) XINE=`printf "mrl=\"%s\"," "${list[@]}"`

qw q b

Trädvy Permalänk
Hedersmedlem
Plats
Stockholm
Registrerad
Dec 2002

Jag föredrar nog att pipe:a till while istället (-print0 behövs inte om man använder while med read):

# Det är ytterst lite snabbare att använda grep än finds inbyggda prylar ;) # -d är inte standard för read så jag undviker det ;) XINE="$( find "$DIR" -type f | egrep '\.(mpg|avi)$' | while read file; do echo -n "mrl=\"$file\"," done)"

Där slapp vi även någon Bash-extension för arrayer, += och liknande.

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Trädvy Permalänk
Medlem
Plats
vänster om atom 276
Registrerad
Jul 2001
Citat:

Ursprungligen inskrivet av m0REc
Jag föredrar nog att pipe:a till while istället (-print0 behövs inte om man använder while med read):

# Det är ytterst lite snabbare att använda grep än finds inbyggda prylar ;) # -d är inte standard för read så jag undviker det ;) find "$DIR" -type f | egrep '\.(mpg|avi)$' | while read file; do echo "File: $i" done

Haha, m0REc, we meet again... ;D

Men om filnamnet innehåller ett newlinetecken blir det problem. Inga filnamn innehåller nulltecken så read -d '' med -print0 har en poäng.

Ex:

flagel@molly:~/Request Matcher$ echo -e "haj\nhoj" | xargs -0 -I {} touch {} flagel@molly:~/Request Matcher$ find . -type f | while read file; do echo "File: $file"; done File: ./Requests.odt File: ./reqfilesoftmp3 File: ./haj File: hoj File: File: ./requestmatcher.bash File: ./reqmatch_windows.png

P.S: Din lösning printar bara ut "File: " hela tiden, MEN om det skulle fungera blir outputen som ovan.

qw q b

Trädvy Permalänk
Hedersmedlem
Plats
Stockholm
Registrerad
Dec 2002

Jepp, hade skrivit "$i" istället för "$file", nu är den dock lite ändrad ifrån ditt citat.

Hm, det är sant. Orkar inte fundera ut någon lösning på det nu så du vinner för tillfället.

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.