Поведение, которое вы ищете, это специальный случай:
cp -R [-H|-L|-P] [-fip] source_file... цель...
[Эта] форма обозначается двумя или более операндами, в которых указана опция -R. Утилита cp должна скопировать каждый файл в файловой иерархии, корневой в каждом файле source_file, в целевой путь с именем:
- Если целевой существует и называет существующую директорию, то именем соответствующего целевого пути для каждого файла в файловой иерархии должно быть конкатенация целевого, один
символ, если целевой не заканчивался на
, и путь к файлу относительно директории, содержащей исходный_файл.
- Если целевой не существует и указаны два операндов, то имя соответствующего пути назначения для файла source_file должно быть целевым; именем соответствующего пути назначения для всех остальных файлов в файловой иерархии должно быть конкатенация целевого, символ
, а также путь к файлу относительно директории, содержащей файл source_file.
Это должно быть ошибкой, если целевой не существует и указано более двух операндов ...
Поэтому я бы сказал, что невозможно заставить cp
делать то, что вы хотите.
Так как ваше ожидаемое поведение "cp -r dir1 dir2
(когда dir2
уже существует) удалит существующий dir2
(и любое содержимое) и заменит его на dir1
":
rm -rf dir2 && cp -r dir1 dir2
Вам даже не нужно проверять, существует ли dir2
.
Решением rsync
было бы добавление трейлинга /
к источнику, чтобы он не копировал сам dir1
в dir2
, а копировал содержимое dir1
в dir2
(при этом существующие файлы все равно останутся в dir2
):
$ tree dir*
dir1
└── test.txt
dir2
└── test2.txt
0 directories, 2 file
$ rsync -a dir1/ dir2
$ tree dir*
dir1
└── test.txt
dir2
└── test.txt
└── test2.txt
0 directories, 3 files
$ rm -r dir2
$ rsync -a dir1/ dir2
$ tree dir*
dir1
└── test.txt
dir2
└── test.txt
0 directories, 2 files
Вы можете использовать gksudo
, который является интерфейсом GTK + для su / sudo.
sudo
запрашивает пароль в командной строке, и gksudo
открывает для него диалоговое окно.
Соответствующая справочная страница
Вы можете установить правило sudo
, чтобы либо все пользователи, либо некоторые определенные пользователи, и/или все члены определенной группы могли запускать скрипт без пароля. например. в /etc/sudoers
:
Cmnd_Alias MYSCRIPT = /usr/local/sbin/mountscript.sh
...
...
cas ALL = NOPASSWD: MYSCRIPT
%admin ALL = NOPASSWD: MYSCRIPT
Это позволяет пользователю cas
и всем членам группы admin
запускать /usr/local/sbin/mountscript.sh
от имени root без необходимости вводить пароль.
mountscript.sh
должен быть предельно простым. Лучше всего, если он не будет принимать никаких аргументов и вообще никаких действий от пользователя, а просто будет выполнять фиксированный набор операций (например, монтировать файловую систему в определенное место и затем завершать работу)
При необходимости можно также unmountscript. sh
, установленный в sudo таким же образом... просто добавьте /usr/local/sbin/unmountscript.sh
в конец строки определения Cmnd_Alias
.
Наконец, ваш значок на рабочем столе будет либо:
sudo /usr/local/sbin/mountscript.sh
, либоsudo /usr/local/sbin/mountscript.sh
в обоих случаях все упомянутые сценарии должны быть mdae исполняемыми с chmod