Взятие объяснения Жабр, но правильно зеркальное отражение 7-го бита согласно спецификации IPv6:
#!/bin/bash
IFS=':'; set $1; unset IFS
printf "fe80::%x%x:%x:%x:%x\n" 0x$(( 0x${1} ^ 0x02 )) 0x${2} 0x${3}ff 0xfe${4} 0x${5}${6}
Пример поразрядных операций:
$ mac_to_ipv6 00:00:00:00:00:00
fe80::200:00ff:fe00:0000
Поведение, которое вы ищете, это специальный случай:
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