Denna delen av 99 uppdateras inte längre utan har arkiverats inför framtiden som ett museum.
Här kan du läsa mer om varför.
Mac-nyheter hittar du på Macradion.com och forumet hittar du via Applebubblan.

Batch kopiering i OSX

Tråden skapades och har fått 18 svar. Det senaste inlägget skrevs .
1

Jag skall kopiera 20st Firewirediskar till ett RAID torn och har ett litet problem.

Om jag kopplar in en hel bunt med diskar och kopierar på vanligt vis så försöker OSX kopiera allting simultant med resultatet att det blir extremt långsamt.

Finns det något kommando eller program där man kan göra en kö för kopieringen?

Alltså

10 Kopiera disk 1
20 if 10=done then go to 30
30 Kopiera disk 2
osv...

Tack o bock på förhand
/Roberth

  • Medlem
  • Stockholm
  • 2010-04-14 12:05

Om du inte är ovän med terminalen så är det tokenkelt, man kör flera kommandon efter varandra genom att pytsa in && mellan dom.

cp /Volumes/SourceDisk1/* /Volumes/TargetDisk/ && /Volumes/SourceDisk2 /Volumes/TargetDisk && etc...

Det blir en lång jäkla radda, men det funkar.

Ursprungligen av Roberth:

10 Kopiera disk 1
20 if 10=done then go to 30
30 Kopiera disk 2

Konstig fråga... du har ju precis skrivit koden i din egen post

Linda in det i ett Appleskript and you're good to go!

  • Medlem
  • Göteborg
  • 2010-04-14 13:24

for i in 1 2 3 4 5 6 7 8 9 10
do
cp -rp /Volumes/Disk$i /sökväg_till_raid_torn
done

eller

for i in disknamn1 disknamn2 disknamn3 disknamn4
do
cp -rp /Volumes/$i /sökväg_till_raid_torn
done

Vilken respons!

Jag är inte alls särskilt bevandrad i OSX utan har nyss switchat.

Terminalvarianten kanske är enklast. Det är lite bökigt i.o.m att det ligger en del krafs på diskarna som jag inte vill ha med.

Det är två mappar från varje disk som skall kopieras till en mapp på måldisken.

Disk 1. MAPP1+MAPP2 skall kopieras till MAPP A på måldisken.
Disk 2. MAPP1+MAPP2 skall kopieras till MAPP B på måldisken.
osv.

Hur skriver man i terminalen för att få igång denna manöver.

Hade en liten förhoppning att det skulle finnas ett program för sånt här men trots idogt googlande inte hittat nåt.

Tack för alla ideer och snabba svar. Det här stället regerar.

/Roberth

  • Medlem
  • Göteborg
  • 2010-04-14 14:12

I Unix kan jag göra såhär, jag vet itne om OSX har ksh stöd ?

#!/usr/bin/ksh
#
set -x

for i in disknamn1 disknamn2 disknamn3 disknamn4
do
cp -rp /Volumes/$i/MAPP_1 /sökväg_till_raid_torn
mv /sökväg_till_raid_torn/MAPP_1 Mapp_A_$i
cp -rp /Volumes/$i/MAPP_2 /sökväg_till_raid_torn/Mapp_B
mv /sökväg_till_raid_torn/MAPP_2 Mapp_B_$i
done

Då kommer den kopiera över hela Mapp1 och Mapp2 till nya disken, och sedan döper den om Mapp_1 till Mapp_A_Disknamn, Mapp_B_Disknamn, du hänger med på principen? OBS, Detta är beroende på om mapparna har samma namn på alla diskarna.

Spara den med filnamn.ksh
kör chmod +x filnamn.ksh för att få den körbar, och sedan exekvera den med ./filnamn.ksh

Ursprungligen av NBK:

I Unix kan jag göra såhär, jag vet itne om OSX har ksh stöd ?

Jodå, sedan 10.4. Har för mig att det rentav är gammal AT&T-Korn Shell.

Skulle dock rekommendera att man använder ditto istället för cp -pr. Då får man med t. ex. symlänkar istället för att cp ska kopiera samma fil flera gånger.

Det funkade inte.

använde && för att separera de olika kopieringarna men den utförde bara den första raden. Inga felmeddelanden eller nåt. Bara sket i allt efter första mappen.

Faen me.

  • Medlem
  • Sollentuna
  • 2010-04-15 14:00
Ursprungligen av Roberth:

Det funkade inte.

använde && för att separera de olika kopieringarna men den utförde bara den första raden. Inga felmeddelanden eller nåt. Bara sket i allt efter första mappen.

Men vänta. Det var ju bara en rad. Hur såg din kod/rader ut egentligen?

Så här borde det kunna funka med ett godtyckligt antal diskar där namnet på disken skall bli ett mappnamn på en volym och där innehållet i den mappen är angivna namn i en sträng:

#! /bin/sh

VOLYMER=$(df -h | grep /dev/ | grep /Volumes | awk '{print $6}' | cut -d "/" -f3)
KOPIERAHIT="/Volumes/RAID"
FRANMAPP="mapp1 mapp2"

for v in ${VOLYMER}
do
for f in ${FRANMAPP}
do
ditto /Volumes/${v}/${f} ${KOPIERAHIT}/${v}/${f}
done
done

Har nu startat kopieringen med terminalen. Det blev jäkligt långt och försvårades av att det var en del blanksteg inblandade. \ Var tydligen lösningen på det

Har stegat mig igenom texten två varv för felsökning. Hoppas jag inte missade något.

Det kommer inte upp någon kopieringsstapel men jag har verifierat att det kopieras genom att visa info på den första målmappen och den växer stadigt.

Nu lämnar jag det här över natten och återkommer med rapport imorgon.

Tack alla som gett förslag på hur man kan gå tillväga.

/Roberth

  • Medlem
  • Göteborg
  • 2010-04-15 09:35

använd ; istället för &&
då går den vidare till nästa om det blir nåt error

Fast iofs, i detta fallet kanske rsync vore nåt? För då tar den ju vid där det slutade ifall nåt skiter sig, så man slipper sitta å kolla "vad har kopierats, vad har inte" osv.

Man måste använda kommandot också, det fungerar inte med kommando sökväg && sökväg ...

Nu har jag inte koden framför mig men det var i stil med cp -rp /volumes/from /volumes/to && cp -rp /volumes osv...

Det var alltså nytt kommando för varje rad efter varje &&.

Nu har jag ändå lyckats få över det mesta under dagen med vanlig tråkkopiering. Sista diskarna står över natten.

Lite märkligt att det inte finns något enkelt program för såna här grejer. Skulle lätt pröjsa några hundra för det.

Antar att det bästa är att sätta sig in i Rsync eller något liknande för att ha en färdig plan nästa gång man ställs inför något sånt här.

/Rob

  • Medlem
  • Göteborg
  • 2010-04-16 06:36

Du fick ju två scripts här av oss? Och ändå provade du inte nån av dem?

Jag är inte så haj på scripts. Fattade inte vad det innebar utan gick efter principen "minsta möjliga motstånd"

Straffade sig som vanligt. Men jag skall fortsätta forska i ämnet så jag är förberedd till nästa gång.
Antar att något sorts backupprogram är bästa lösningen. De borde ju göra sin kopieringar i serie eller?

  • Medlem
  • Göteborg
  • 2010-04-16 12:45

Problemet är att när man kör && så avbryter den när nåt går fel, den hoppar inte vidare till nästa

  • Medlem
  • Sollentuna
  • 2010-04-16 13:10
Ursprungligen av NBK:

Problemet är att när man kör && så avbryter den när nåt går fel, den hoppar inte vidare till nästa

The control operators && and || denote AND lists and OR lists,  respec-
       tively.  An AND list has the form

              command1 && command2

       command2  is  executed if, and only if, command1 returns an exit status
       of zero.

       An OR list has the form

              command1 || command2

       command2 is executed if and only if command1 returns  a  non-zero  exit
       status.   The  return  status of AND and OR lists is the exit status of
       the last command executed in the list.
1
Bevaka tråden