• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

shell skript (bitte helfen)

mikegolan

Newbie
Hallo leute,
ich hab ein Problem. ich möchte aus einem Verzeichniss alle Unterverzeichnisse in ein ein anderes Verzeichnis kopieren.
dafür möchte ich einen Skript schreiben, der das ganze automatisch macht... das Problem ist , dass der Name der einzelnen Unterverzeichnisse muss in der Komandozeile beim Aufruf des Skripts (für jedes Unterverzeichnis einen Aufruf) eingegeben werden. :cry:
wie kann das ganze realisieren?? ein Beispiel wäre sehr nett.

danke
 

nbkr

Guru
Dafür brauchts kein Shellscript. Das kann cp auch.

Code:
cp -R /quellverzeichnis /zielverzeichnis
 

mr_kaktus

Member
Hi,

also habe ich das richtig Verstanden, du willst aus einem Verzeichnis "A"
der wieder rum unter Verzeichnisse besittzt sagen wir mal "VER1, VER2, VER2" in das Verzeichnis "B" kopieren?
Wenn das so ist, dann würde ich an deiner Stelle eine Forschleife benutzen, ist eigentlich total easy:
Code:
#!/bin/bash

pfadA="/root/A"
pfadB="/root/B"

for VERZEICHNIS in `ls $pfadA`
do
  cp -av $pfadA/$VERZEICHNIS $pfadB
done
 
OP
M

mikegolan

Newbie
hi,
danke für deine Antwort ... ich weiss dass ich es mit cp machen kann aber
der Benutzer möchte es leichter machen über einen Skript um tippaufwand zu sparen

wie kann ich in meinem skript eine variable (source_path) lesen und die if abfrage durchführen??

danke
 

nbkr

Guru
Der erste Parameter der an das Script übergeben wird findet sich in der Variable $1. Der zweite in $2 usw. if geht so

Code:
if [[ "hell" == "frozenover" ]]; then
  echo "New Linux Version out now: Written in Visual Basic using a Messaging Passing concept!";
fi

Bitte auf die Leerzeichen innerhalb der [[ ]] achten. Sonst gehts nicht.
 
Sorry, aber wenn der User auch noch Quelle und Ziel eingeben soll, kann er gleich cp -R verwenden, alles Andere wäre schwachsinnig.
 
OP
M

mikegolan

Newbie
hab als erstes alles was im Zielpfad gelöscht und
anschliessend von Quellepfad ins Ziel kopiert...
ich weiss nicht ob es am besten so ..

Code:
#!/bin/bash

pfadQuelle=$1
pfadZiel=$2

for VERZEICHNIS_ZIEL in `ls $pfadZiel`
do
      rm -r $pfadZiel/$VERZEICHNIS_ZIEL 
done 
for VERZEICHNIS in `ls $pfadQuelle`
do 
	cp -av $pfadQuelle/$VERZEICHNIS $pfadZiel     
  		 
done
 

styyxx

Member
Tach

mikegolan schrieb:
ich weiss nicht ob es am besten so ..

Sicher nicht ;-)

Mir ist nicht ganz klar was du willst aber so wie du das machst ist es schon ein wenig riskant.
Du überprüfst rein gar nix. Wenn da jemand mist übergibt kann das böse enden...
Ich hab da mal was hingeschmiert:
Code:
#!/bin/bash

if [ $# -ne 2 ]
then
        echo "Usage: subdircopy.sh <destination directory> <target directory>"
        echo "Warning: All existing sub directorys and there contents in <target directory> will be lost."
        exit 1
fi

#Seek and destroy
find $2 -maxdepth 1 ! -wholename $2 -type d -exec rm -rf {} \;
#Seek and create
find $1 -maxdepth 1 ! -wholename $1 -type d -exec cp -av {} $2 \;

exit 0
Das ist bei weitem noch nicht perfekt. Da kann man noch viel mehr abfangen oder sich evtl. auch um die Rückgabewerte kümmern. Zu bedenken ist auch das 'find' nicht unbedingt durch seine Geschwindigkeit bekannt ist. Wenn das wirklich GROSSE Verzeichnisse sind würd ich das eher in perl machen.

Grüße
micha
 
OP
M

mikegolan

Newbie
Hallo Micha,
danke für deinen HInweis..
aber es hat sich herrausgestellt dass die aufgabe komplizierter ist:

es muss mit dem Befehl mehrere(unbegrenzt) Verzeichnisse eingegeben, die wierderum in einem vordefenierten Verzeichnis kopiert werden. Dazu müssen nicht alle Inhalte kopiert werden sonder nur alle ZIP + HTML Datein . Es muss aber in allen Unterverzeichnissen durchsucht und entsprechend kopiert.

kannst du mir bitte sagen wie ich am besten das tun könnte oder wie kann ich auch Dateityp abfragen ....???

bitte helfen
danke im vorraus
 

styyxx

Member
Hallo Mike,

da gibts mehrere Wege, wie eigentlich immer ;-)
Da ich dir jetzt nicht alles vorkauen will, hier mal ein paar Stichworte:

Für die Optionen nimm getops.
Code:
while getopts ":s:d:" options
do
        case $options in
        s )     sourcedir=$OPTARG;;
        d )     destinationdir=$OPTARG;;
        * )     echo "Unknown...";exit 1;;
        esac
done
Damit kannst du auf der Kommandozeile dann sowas wie 'befehl -s "arg1 arg2 arg3" -d arg1' machen.

Dann nimmst du die einträge aus sourcedir und gehst entweder mit einem find drüber, falls du die Dateien anhand einer Endung erkennen willst.
Du kannst auch mit dem file Kommando rumspielen um die Dateien zu erkennen. Da mußt du das ganze natürlich in eine Schleife packen.

Dannach mußt du ja nur noch die entsrechenden Unterverzeichnisse anlegen und die gefundenen Dateien hinein kopieren, bzw. die Unterverzeichnise würde ich als erstes anlegen, die Namen hast du ja dann in deiner sourcedir.

Fassen wir zusammen. Deine Freunde sind:
  • - find
    - file
    - mkdir
    - cp
    - getops
    - man
Falls du nicht weiter kommst, melde dich halt nochmal.

Grüße
micha
 
OP
M

mikegolan

Newbie
Hallo Micha,
kannst du es mir einbisschen näher erklären bitte.. wie kann z.B. die Optionen s und d definieren ... es tut mir leid wenn ich dir auf die Nerven gehe.. bin aber ganz neu bei shell programmierung.

danke dir
 
Oben