
Как создать новую команду терминала, которая копирует папку (это всегда будет одна и та же папка) и ее содержимое либо в текущий каталог (если путь не указан), либо по указанному пути?
Эта команда должна принимать следующие параметры:
- Имя новой папки, в которую нужно скопировать содержимое (например,
mkdir myNewFolder
) - Путь к каталогу, в котором следует создать новую папку и вставить в нее ее содержимое.
Я бы хотел получить что-то вроде этого:
$ 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 create
destpath/dirnm as given and on success copy
it wall всегда будет той же папкой to
destpath/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