Создайте новую команду Mac Terminal для копирования папки

Создайте новую команду Mac Terminal для копирования папки

Как создать новую команду терминала, которая копирует папку (это всегда будет одна и та же папка) и ее содержимое либо в текущий каталог (если путь не указан), либо по указанному пути?

Эта команда должна принимать следующие параметры:

  1. Имя новой папки, в которую нужно скопировать содержимое (например, mkdir myNewFolder)
  2. Путь к каталогу, в котором следует создать новую папку и вставить в нее ее содержимое.

Я бы хотел получить что-то вроде этого:

$ createsite newFolderName ./Desktop/sites/

Я не знаю, с чего начать. Так что любая помощь будет оценена по достоинству.

решение1

Если вы не хотите просто использовать mkdir -pи затем cp, то вы можете также создать достаточно надежную функцию для копирования it wall always be the same folderв каталог с именем, указанным dirnmв качествепервый аргумент(в текущем рабочем каталоге, если не указан второй аргумент) или в, если в аргументе указан /destpath/dirnmпуть, представляющийdestpathвторой аргумент.

При формировании задействованных путей вам нужно будет проверить (и удалить) начальные и конечные '/'символы в dirnmи любые конечные символы '/'в destpath. You then attempt to createdestpath/dirnm as given and on success copyit wall всегда будет той же папкой todestpath/dirnm (with the-a` option, или по желанию). В случае неудачи выдать ошибку и вернуться. Ниже приведен один из подходов к такой функции:

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 )
}

Я бы включил функцию в ваш ~/.bashrc(или ~/.profile) или вы можете вручную ввести/экспортировать ее в вашей текущей оболочке. Я бы также создал удобный aliasдля сокращения ввода после объявления, .bashrcнапример:

alias mdcp='mkdircp'

С псевдонимом использование следующее:

mdcp dirnm [destpath (default: ./)]

Копировать it wall always be the same folderв destpath/dirnm. Дайте мне знать, если у вас возникнут вопросы или вам нужно будет что-то немного подкорректировать.

решение2

Я бы использовал функцию. Добавьте эти строки в свой ~/.profile(или, если не на OSX, в свой ~/.bashrc):

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
}

Затем откройте новый терминал и запустите

createsite foo

Что скопирует содержимое /path/to/source/folderв недавно созданный каталог foo. Обратите внимание, что это очень упрощенный подход, и он не предупредит вас, если каталог существует или если файлы будут перезаписаны.

Или просто запустите createsite, и он скопирует данные в текущий каталог.

решение3

rsync — это команда, которая может вам помочь. Она может эффективно синхронизировать 2 папки, просматривая различия между ними. Она также работает по сети.

rsync source destination

Источник или назначение могут быть выражениями, например, pwdили ${HOME}; относительными, например, . ; или фиксированными, например, /tmp

Для получения более подробной информации прочтите подробные страницы руководства:

man rsync

Связанный контент