Синтаксические различия в CP-r и как преодолеть их

Взятие объяснения Жабр, но правильно зеркальное отражение 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

5
08.12.2014, 22:05
1 ответ

Поведение, которое вы ищете, это специальный случай:

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
4
27.01.2020, 20:40

Теги

Похожие вопросы