![创建新的 Mac 终端命令来复制文件夹](https://linux22.com/image/1447702/%E5%88%9B%E5%BB%BA%E6%96%B0%E7%9A%84%20Mac%20%E7%BB%88%E7%AB%AF%E5%91%BD%E4%BB%A4%E6%9D%A5%E5%A4%8D%E5%88%B6%E6%96%87%E4%BB%B6%E5%A4%B9.png)
如何创建一个新的终端命令,将一个文件夹(这将始终是同一个文件夹)及其内容复制到当前目录(如果没有提供路径)或提供的路径。
该命令应采用以下参数:
- 要将内容复制到的新文件夹的名称(即
mkdir myNewFolder
) - 创建新文件夹并将内容粘贴到其中的目录的路径。
我希望得到这样的结果:
$ createsite newFolderName ./Desktop/sites/
我真的不知道从哪里开始。所以任何帮助我都感激不尽
答案1
如果你不想简单地使用mkdir -p
,然后cp
,那么你也可以创建一个相当强大的函数来复制it wall always be the same folder
到给出的目录名,dirnm
作为第一个参数(如果没有给出第二个参数,则在当前工作目录中)或者如果在参数中给出了/destpath/dirnm
表示的路径作为destpath
第二个论点。
在形成所涉及的路径时,您需要检查(并删除) destpath/dirnm 中的前导和尾随字符,并且 destpath/dirnm'/'
中的dirnm
任何尾随字符始终是相同的文件夹destpath/dirnm -a` 选项,或根据需要)。如果失败,则抛出错误并返回。以下是此类函数的一种方法:'/'
destpath. You then attempt to create
as given and on success copy
to
(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 )
}
我会将该函数包含在您的~/.bashrc
(或 ~/.profile)中,或者您可以在当前 shell 中手动输入/导出它。我还将创建一个方便的方法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 是一个可以帮助您的命令。它可以通过查看两个文件夹之间的差异来高效地同步它们。它也可以通过网络工作。
rsync source destination
源或目标都可以是表达式,例如pwd
或 ${HOME};相对的,例如 . ;或固定的,例如 /tmp
欲了解更多信息,请阅读详细手册页:
man rsync