Ich bin sehr neu Bash scritping und bekommt einige Übung zu kopieren, ich bin versucht, ein Skript zu schreiben, die in einem Quellverzeichnis und ein Zielverzeichnis erfolgt. Das Skript durchsucht das Quellverzeichnis und kopiert seine Unterverzeichnisstruktur in das Zielverzeichnis (alle Dateien werden ignoriert, nur die Verzeichnisse selbst werden dupliziert). Das Quellverzeichnis kann beliebig viele Unterverzeichnisse enthalten. Was wäre der beste Weg, dies zu erreichen? Ich habe mit dem Versuch begonnen, eine rekursive Funktion zu schreiben, bei der, wenn ein Verzeichnis gefunden wird, die Funktion rekursiv auf dieses Verzeichnis aufgerufen wird. Aufgrund meiner mangelnden Erfahrung mit Skripten bin ich jedoch ratlos. HierBash-Skript die Verzeichnisstruktur von Quellverzeichnis in dem Zielverzeichnis
ist das, was ich bisher:
#! /bin/bash
if [ ! $# -eq 2 ]; then
echo "ERROR: Script needs 2 arguments: $0 source/directory/ target/directory/"
exit
fi
SOURCE_DIR=$1
TARGET_DIR=$2
function searchForDirectory {
for FILE in ls $SOURCE_DIR/*; do #should be 'ls *current_directory*'
if [ -d $FILE ]; then
searchForDirectory #call function recursively onto $FILE
#Do stuff here to create copy of this directory in target dir
fi
done
}
if [ ! -d $SOURCE_DIR ]; then
echo "ERROR: Source directory does not exist"
exit
else
searchForDirectory
fi
Ich weiß, dass dies nur ein Skelett-Funktion und eine Menge mehr Arbeit müsste in sie werden gestellt, aber ich bin nur für die Führung ob dies der richtige Weg ist, bevor ich weiter gehe, und wenn ja, was wäre mein nächster Schritt? Wie gebe ich ein Verzeichnis in meine Funktion ein?
EDIT: Hier ist meine Lösung dank Ivans Hilfe unter #!/Bin/bash
if [ ! $# -eq 2 ]; then
echo -e "\nERROR: Script needs 2 arguments:\n$0 source/directory/ target/directory/\n"
exit
fi
function recursiveDuplication {
for file in `ls $1`; do
if [ -d $1/$file ] && [ ! -d $2/$file ]; then
mkdir $2/$file
recursiveDuplication $1/$file $2/$file
elif [[ $1/$file == *.png ]]; then
convert $1/$file $2/$file
fi
done
}
if [ ! -d $1 ]; then
echo -e "\nERROR: $1 does not exist\n"
exit
elif [ -d $2 ] && [ ! -w $2 ]; then
echo -e "\nERROR: You do not have permission to write to $2\n"
exit
elif [ ! -d $2 ]; then
echo -e "\nSUCCESS: $2 has been created"
mkdir $2
fi
recursiveDuplication $1 $2
Es gibt zwei Probleme mit dieser Lösung:
Wie Rany Albeg Wein unten erläutert wird, 'ls' verwendet, ist keine gute Lösung - und ich habe gesehen, warum, wenn es ist ein Leerzeichen in einem Verzeichnis/*. png Name.
Ich versuche auch, eine * .png Datei von der Quelle zum Ziel zu kopieren und sie in ein * .jpg Bild im Ziel umzuwandeln. Wie kann ich das machen? Ich versuche ImageMagicks
convert image.png image.jpg
Befehl zu verwenden, aber nicht wissen, wie dies zu tun, wenn dieimage.png
wird als$file
bezeichnet wird?
Wenn Sie interessiert sind, kann es durch 'find' und' cpio' erreicht werden. 'finde Quellentyp - d | cpio -pd Ziel'. Der gesamte Baum von "source" wird nach "target" kopiert. Wenn der Befehl von "root" ausgeführt wird, können Berechtigungen und Besitzrechte beibehalten werden. Wenn es von einem Nicht-Stammverzeichnis ausgeführt wird, kann nur die Berechtigung beibehalten werden. – alvits
@KOB Eine neue Antwort wurde mit einer getesteten sicheren Lösung hinzugefügt, die 'gnu cpio' verwendet –