Erstellen Sie einen neuen Mac-Terminal-Befehl zum Kopieren des Ordners

Erstellen Sie einen neuen Mac-Terminal-Befehl zum Kopieren des Ordners

Wie kann ich einen neuen Terminalbefehl erstellen, der einen Ordner (dies ist immer derselbe Ordner) und seinen Inhalt entweder in das aktuelle Verzeichnis (wenn kein Pfad angegeben ist) oder in den angegebenen Pfad kopiert?

Dieser Befehl sollte die folgenden Parameter annehmen:

  1. Name des neuen Ordners, in den der Inhalt kopiert werden soll (z. B. mkdir myNewFolder)
  2. Der Pfad des Verzeichnisses, in dem der neue Ordner erstellt und der Inhalt eingefügt werden soll.

Ich hätte am Ende gerne so etwas:

$ createsite newFolderName ./Desktop/sites/

Ich weiß nicht wirklich, wo ich damit anfangen soll. Daher bin ich für jede Hilfe dankbar.

Antwort1

Wenn Sie nicht einfach mkdir -pund dann ein verwenden möchten cp, können Sie auch eine ziemlich robuste Funktion erstellen, um it wall always be the same folderin das Verzeichnis zu kopieren, das durch dirnmden Namen als angegeben wird.erstes Argument(im aktuellen Arbeitsverzeichnis, wenn kein zweites Argument angegeben ist) oder wenn im Argument /destpath/dirnmein Pfad angegeben ist, der dasdestpathzweites Argument.

Beim Bilden der beteiligten Pfade müssen Sie führende und nachfolgende '/'Zeichen dirnmund alle nachfolgenden Zeichen '/'in destpath. You then attempt to createdestpath/dirnm überprüfen (und entfernen) as given and on success copy. Es muss sich immer um denselben Ordner handeln (Option todestpath/dirnm (with the-a oder wie gewünscht). Bei einem Fehler wird ein Fehler ausgegeben und die Datei wird zurückgegeben. Im Folgenden finden Sie einen Ansatz für eine solche Funktion:

mkdircp ()
{
    srcdir="NameOfDirToCopy"    ## the name of the dir you always copy (w/full path)

    [ -d "$srcdir" ] || {       ## validate srcdir exists
        printf "error: source directory '%s' does not exist.\n" "$srcdir"
        return 1
    }

    [ -z $1 ] && {              ## validate that required dirnm given
        printf "usage: mdcp dirnm [destpath (default ./)]\n";
        return 1
    };

    ## trim leading/trailing '/' from dirnm
    [ ${1:0:1} == '/' ] && dirnm="${1:1}" || dirnm="$1"
    [ ${1:(-1)} == '/' ] && dirnm="${dirnm%/}"

    ## if destpath given, trim trailing '/' & set destdir
    if [ -n "$2" ]; then
        [ ${2:(-1)}x == '/x' ] && destpath="${2%/}" || destpath="$2"
        [ -n "$2" ] && destdir="${destpath}/${dirnm}"
    else
        destdir="./$dirnm"    ## default destdir in ./
    fi

    ## create destdir & validate or throw error
    [ -d "$destdir" ] || mkdir -p "$destdir"
    [ -d "$destdir" ] || {
        printf "error: unable to create destdir '%s'. (check permissions)\n" "$destdir"
        return 1
    }

    ## copy (-recursive -archive) "$srcdir" "$destdir"
    printf "copying:  %s -> %s\n" "$srcdir" "$destdir"
    # cp -a "$srcdir" "$destdir"    ## (uncomment for actual copy )
}

Ich würde die Funktion in Ihr ~/.bashrc(oder ~/.profile) einbinden, oder Sie können sie manuell in Ihre aktuelle Shell eingeben/exportieren. Ich würde auch eine praktische Funktion erstellen, aliasum die Tipparbeit nach der Deklaration zu reduzieren, .bashrcetwa:

alias mdcp='mkdircp'

Mit dem Alias ​​lautet die Verwendung:

mdcp dirnm [destpath (default: ./)]

Zum Kopieren it wall always be the same foldernach destpath/dirnm. Wenn du Fragen hast oder ein paar Dinge anpassen musst, melde dich bei mir.

Antwort2

Ich würde eine Funktion verwenden. Fügen Sie diese Zeilen zu Ihrer ~/.profile(oder, wenn nicht unter OSX, zu Ihrer ~/.bashrc) hinzu:

createsite(){
    ## Change this to point to the folder you want to copy
    source="/path/to/source/folder"

    ## If no parameters were given, copy to the current directory
    if [ $# -eq 0 ];
    then    
        cp -rv "$source" .
    ## If an argument was given
    elif [ $# -eq 1 ]
    then
        ## Create the directory. The -p suppresses error messages
        ## in case the directory exists.
        mkdir "$1"
        ## Copy
        cp -rv "$source" "$1"/
    ## If more than one was given, something's wrong.
    else
        echo "Usage: $0 [target_directory]";
        exit 1;
    fi
}

Öffnen Sie dann ein neues Terminal und Sie können ausführen

createsite foo

Dadurch wird der Inhalt /path/to/source/folderin das neu erstellte Verzeichnis kopiert foo. Beachten Sie, dass dies ein sehr vereinfachter Ansatz ist und Sie nicht warnt, ob das Verzeichnis existiert oder ob Dateien überschrieben werden.

Oder führen Sie es einfach aus createsiteund es wird in das aktuelle Verzeichnis kopiert.

Antwort3

rsync ist ein Befehl, der Ihnen helfen könnte. Er kann zwei Ordner effizient synchronisieren, indem er die Unterschiede zwischen ihnen prüft. Er funktioniert auch über das Netzwerk.

rsync source destination

Quelle und Ziel können Ausdrücke sein, wie pwdoder ${HOME}; relativ, wie . ; oder fest, wie /tmp

Weitere Informationen finden Sie in den ausführlichen Handbuchseiten:

man rsync

verwandte Informationen