Allt från Computex 2023

Kommando/Script för att zippa massa mappar?

Permalänk
Medlem

Kommando/Script för att zippa massa mappar?

Jag har bläddrat runt lite i zip-manualen nu, men jag fattar fan inte hur man zippar något iallafall. Dessutom tror jag att jag behöver en for-sats till det jag ska göra, och jag vet inte hur man använder sånna i shellscripting.

Det jag vill göra är att jag vill zippa alla mappar som ligger i en mapp. Typ så här:

cd mapp_d\är_allt_ligger ls mapp1 mapp2 mapp3 <komamndot jag söker> ls mapp1 mapp1.zip mapp2 mapp2.zip mapp3 mapp3.zip

Visa signatur

Macbook Pro 15" (2,4 GHz Core Duo)

Permalänk
Medlem

for i in `ls`; do zip -r "$i.zip" $i; done;

Visa signatur

Hur man installerar program i *nix | There is no Swedish conspiracy

these days you can't use the Web at 2400 baud because the ads are 24KB - Bill Joy

Permalänk

Eller:

for i in * do zip -r "$i.zip" $i done

Permalänk
Medlem

Om du har mellanslag i mappnamnen så skulle jag ändra ovanstående förslag till

for i in * do zip -r "$i.zip" "$i" done

Visa signatur

Kriga mot min brute: http://gunnard.se.mybrute.com om du vågar :D

Permalänk
Citat:

Ursprungligen inskrivet av GunnarD
Om du har mellanslag i mappnamnen så skulle jag ändra ovanstående förslag till

for i in * do zip -r "$i.zip" "$i" done

Hmm... Det där kommer inte att fungera. Först parsas * till alla namn i katalogen, sedan läses de som en lång mellanslagsseparerad lista; så filnamn med mellanslag kommer inte att fungera med for-satser. I stället får man använda en while-sats. T.ex:

ls | while read dirs do zip -r ${dirs}.zip $dirs done

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Sachankara
Hmm... Det där kommer inte att fungera. Först parsas * till alla namn i katalogen, sedan läses de som en lång mellanslagsseparerad lista; så filnamn med mellanslag kommer inte att fungera med for-satser.

Är du säker?
Testade det just på min linux burk och fick följande resultat:

$ ls -l total 0 -rw-r--r-- 1 XXX XXX 0 Feb 24 13:31 bar.txt -rw-r--r-- 1 XXX XXX 0 Feb 24 13:31 foo bar.txt -rw-r--r-- 1 XXX XXX 0 Feb 24 13:31 foo.txt $ for i in *; do echo "i=$i"; done i=bar.txt i=foo bar.txt i=foo.txt $

Vilket tyder på att den faktiskt behåller mellanslagen i listan. Om inte så borde resultatet blivit:

i=bar.txt
i=foo
i=bar.txt
i=foo.txt

Skulle tro att listan blir nyradseparerad, prova ex: "ls |less" då får man ett filnam per rad, inte en lång rad med filnamn.

Visa signatur

Kriga mot min brute: http://gunnard.se.mybrute.com om du vågar :D

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av GunnarD
Om du har mellanslag i mappnamnen så skulle jag ändra ovanstående förslag till

for i in * do zip -r "$i.zip" "$i" done

Det verkar funka, den tuggar på nu.
Den har gjort ett par av dom nu, och det hoppar iallafall upp separata zip-filer. Outputen säger mig att den stoppar in alla filer som den ska också.

Visa signatur

Macbook Pro 15" (2,4 GHz Core Duo)

Permalänk
Citat:

Ursprungligen inskrivet av GunnarD
Är du säker?
Testade det just på min linux burk och fick följande resultat:

$ ls -l total 0 -rw-r--r-- 1 XXX XXX 0 Feb 24 13:31 bar.txt -rw-r--r-- 1 XXX XXX 0 Feb 24 13:31 foo bar.txt -rw-r--r-- 1 XXX XXX 0 Feb 24 13:31 foo.txt $ for i in *; do echo "i=$i"; done i=bar.txt i=foo bar.txt i=foo.txt $

Vilket tyder på att den faktiskt behåller mellanslagen i listan. Om inte så borde resultatet blivit:

i=bar.txt
i=foo
i=bar.txt
i=foo.txt

Skulle tro att listan blir nyradseparerad, prova ex: "ls |less" då får man ett filnam per rad, inte en lång rad med filnamn.

inte det heller

prova följande exempel

for i in bar "foo bar" "foo bar"; do printf "$i\n"; done

wildcards i en for-sats expanderas till "fil1" "fil2 "fil3" etc, oavsett om filerna inehåller tab nyrad eller blanksteg

kör man däremot en for-loop på en variabel utan citationstecken kommer $IFS att inverka:

BAZ="foo bar baz bag" for FOO in $BAZ do printf "$FOO\n" done

Visa signatur

/Tj

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av T-Mastah J
inte det heller

Jodå det fungerar på mina maskiner (bash på Solaris9 och Mandriva Linux)

Citat:

Ursprungligen inskrivet av T-Mastah J
wildcards i en for-sats expanderas till "fil1" "fil2 "fil3" etc, oavsett om filerna inehåller tab nyrad eller blanksteg

Riktigt, de är mellanslagseparerad men filerna är omgärdade av "" vilket gör att mellanslag behålls i for variabeln men "" följer inte med in i variabeln utan man måste sätta "" runt variabeln när man använder den för att behålla mellanslagen..

Precis som om man skrev

for i in "foo.txt" "foo bar.txt" "bar.txt"; do zip -r "$i.zip" "$i" done

Då blir resultatet rätt

Däremot hadde man skrivit

zip "$i.zip" $i

Så hadde i "foo bar.txt" fallet kommandot blivit.

zip "foo bar.txt.zip" foo bar.txt

Vilket inte är lyckat, därför satte jag även sista $i innanför "" så att kommandot blir:

zip "foo bar.txt.zip" "foo bar.txt"

Visa signatur

Kriga mot min brute: http://gunnard.se.mybrute.com om du vågar :D

Permalänk
Medlem

Om man skriver 'ls *' får man inte fram att en massa saker inte går att hita, vilket betyder att det borde funka med en enkel sjärna även i ett script.