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

Permalänk
Medlem

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

Visa signatur

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

Permalänk
Medlem

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..

Visa signatur

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

Permalänk
Medlem

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

Visa signatur

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

Permalänk
Medlem

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.

Visa signatur

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

Permalänk
Medlem

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

Visa signatur

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

Permalänk
Medlem

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[@]}"`

Visa signatur

qw q b

Permalänk
Hedersmedlem

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.

Visa signatur

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

Permalänk
Medlem
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.

Visa signatur

qw q b

Permalänk
Hedersmedlem

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.

Visa signatur

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