CP - no-target-directory объясненный

fdisk -l перечислит

Использование:

 fdisk [options] -l <disk> list partition table(s)
 fdisk -s <partition>      give partition size(s) in blocks
 fdisk [options] <disk>    change partition table
10
13.10.2013, 23:34
3 ответа

По умолчанию, cp тесты, если его последним аргументом является существующий каталог. Если это происходит, cp создает ссылку в том каталоге, с базовым именем источника. Таким образом, учитывая команду

cp foo/bar wibble

если wibble существующий каталог затем cp копирует источник в wibble/bar. Если wibble не существует затем cp связывает источник с wibble.

Если Вы хотите быть уверенными, что копия всегда wibble, затем можно указать --no-target-directory (псевдоним -T) опция. Тот путь, если cp успешно выполняется, можно быть уверены, что копию называют wibble. Если wibble уже существовал как каталог, затем cp перестанет работать.

В табличной форме:

The target is …             Without -T               With -T
existing directory          copy in the directory    error
existing file (not dir)     overwrite                overwrite
does not exist              create                   create

Единственная разница - это с -T, в случае, если цель является существующим каталогом, команда возвращает ошибку. Это полезно, когда Вы ожидаете, что каталог не будет существовать: Вы получаете сообщение об ошибке вместо чего-то непредсказанный случай.

То же относится mv и ln. Если цель является существующим каталогом, с -T, они сигнализируют об ошибке вместо того, чтобы тихо делать что-то другое.

С cp, существует другой случай. Если Вы делаете рекурсивная копия и источник являются каталогом, то cp -T копирует содержание источника в место назначения, вместо того, чтобы копировать сам источник. Таким образом, данный

$ tree source destination 
source
└── foo
destination
└── bar

затем

$ cp -rv source destination
`source' -> `destination/source'
`source/foo' -> `destination/source/foo'

тогда как

% cp -rvT source destination
`source/foo' -> `destination/foo'
15
27.01.2020, 19:59

Как насчет следующего?

$ cp -rvT Dir_1 Dir_2
‘Dir_1/File_3.txt’ -> ‘Dir_2/File_3.txt’
‘Dir_1/File_1.txt’ -> ‘Dir_2/File_1.txt’
‘Dir_1/File_2.txt’ -> ‘Dir_2/File_2.txt’
$ cp -rv Dir_1 Dir_2
‘Dir_1’ -> ‘Dir_2/Dir_1’
‘Dir_1/File_3.txt’ -> ‘Dir_2/Dir_1/File_3.txt’
‘Dir_1/File_1.txt’ -> ‘Dir_2/Dir_1/File_1.txt’
‘Dir_1/File_2.txt’ -> ‘Dir_2/Dir_1/File_2.txt’

По сути, это - просто другой способ записать cp Dir_1/* Dir_2/. Однако это действительно ловит скрытые файлы в корне Dir_1, который был бы пропущен простым cp *.

$ touch Dir_1/.Hidden_File_{1,2,3}.txt
$ cp -rv Dir_1/* Dir_2
cp: No match.
$ cp -rvT Dir_1 Dir_2
‘Dir_1/.Hidden_File_2.txt’ -> ‘Dir_2/.Hidden_File_2.txt’
‘Dir_1/.Hidden_File_3.txt’ -> ‘Dir_2/.Hidden_File_3.txt’
‘Dir_1/.Hidden_File_1.txt’ -> ‘Dir_2/.Hidden_File_1.txt’
2
27.01.2020, 19:59
  • 1
    работает на меня с --no-target-directory опция: пока я использую - рекурсивный, все соглашается [с coreutils 8.12 под GNU/Linux]. Основное различие, кажется, это с --no-target-directory содержание, но не сам каталог копируется [исследование, все еще происходящее] –  erch 13.10.2013, 19:24

Вы использовали бы --no-target-directory если Вы не хотите исходный каталог, скопированный под существующим целевым каталогом, Вы хотите исходный каталог, скопированный на целевой каталог.

Вот пример копии каталога с и без --no-target-directory:

$ mkdir a
$ touch a/b a/c
$ find
.
./a
./a/c
./a/b
$ cp -r a b       # b does not exist; becomes copy of a
$ find
.
./b
./b/b
./b/c
./a
./a/c
./a/b
$ rm -r b
$ mkdir b
$ cp -r a b       # b already exists; a is copied *underneath* it
$ find
.
./b
./b/a
./b/a/b
./b/a/c
./a
./a/c
./a/b
$ rm -r b
$ mkdir b
$ cp -r --no-target-directory a b     # b already exists; becomes copy of a
$ find
.
./b
./b/b
./b/c
./a
./a/c
./a/b

Можно достигнуть чего-то вроде того же эффекта путем добавления суффикса исходного имени (имен) каталога точку наклонной черты /. как в: cp -r a/. b который копирует исходный каталог a на b и не внизу b.

Ни один из вышеупомянутых методов не совпадает с высказыванием, "копируют только содержание исходного каталога существующему месту назначения" с тех пор, если Вы попросите сохранять время и полномочия, то существующий целевой каталог получит время и полномочия исходного каталога. Пример (отредактированный для удаления ненужной информации):

$ find . -ls
drwx------   Oct 13 13:31 ./b         # note date and permissions
drwxr-xr-x   Jan  1  2013 ./a         # note date and permissions
-rw-r--r--   Oct 13 13:23 ./a/c
-rw-r--r--   Oct 13 13:23 ./a/b
$ cp -rp --no-target-directory a b    # preserve mode and timestamps
$ find . -ls
drwxr-xr-x   Jan  1  2013 ./b         # note copied date and permissions
-rw-r--r--   Oct 13 13:23 ./b/b
-rw-r--r--   Oct 13 13:23 ./b/c
drwxr-xr-x   Jan  1  2013 ./a
-rw-r--r--   Oct 13 13:23 ./a/c
-rw-r--r--   Oct 13 13:23 ./a/b

Копия только для содержания не передала бы режим или метки времени исходного каталога к целевому каталогу.

8
27.01.2020, 19:59

Теги

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