フォルダをコピーするための新しいMacターミナルコマンドを作成する

フォルダをコピーするための新しいMacターミナルコマンドを作成する

フォルダー (常に同じフォルダー) とその内容を現在のディレクトリ (パスが指定されていない場合) または指定されたパスにコピーする新しいターミナル コマンドを作成するにはどうすればよいですか。

このコマンドには次のパラメータが必要です。

  1. 内容をコピーする新しいフォルダの名前(例mkdir myNewFolder:)
  2. 新しいフォルダーを作成し、その内容を貼り付けるディレクトリのパス。

最終的には次のようになります。

$ createsite newFolderName ./Desktop/sites/

どこから始めたらいいのかよく分かりません。どんな助けでもありがたいです

答え1

mkdir -p単にと を使いたいだけなら、で指定されたディレクトリ名にcpコピーするかなり堅牢な関数を作成することもできます。it wall always be the same folderdirnm最初の引数(2番目の引数が指定されていない場合は現在の作業ディレクトリ)または、引数に/destpath/dirnmパスが指定されている場合はdestpath2番目の引数

関連するパスを形成するには、destpath/dirnm の先頭と末尾の文字をチェック (および削除) する必要があります。また、destpath/dirnm'/'の末尾の文字はdirnm常に同じフォルダー ( destpath/dirnm -a` オプション、または必要に応じて) である必要があります。失敗した場合は、エラーをスローして戻ります。以下は、このような関数への 1 つのアプローチです。'/'destpath. You then attempt to createas given and on success copyto(with the

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

関数をあなたの (または ~/.profile) に含めるか、現在のシェルで手動で入力/エクスポートすることができます。また、次のような宣言に続いて、入力を減らす~/.bashrc便利なものを作成します。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

関連情報