Назад | Перейти на главную страницу

Рекурсивный cp копирует содержимое папки вместо папки в OS X

В терминале (с использованием bash и tcsh) cp -r копирует содержимое папки вместо папки, если аргумент папки имеет / в конце.

Учитывая следующую структуру:

folderA
  |-fileA
  |-fileB

Следующая команда копирует файлA и файлB в место назначения вместо копирования папкиA в место назначения:

cp -r folderA/ destination

Так что он действует как

cp -r folderA/* destination

Это очень раздражает, потому что по умолчанию завершение в tcsh добавляет / в конец папки, поэтому мне всегда приходится очищать, если я забываю удалить / в конце. Это поведение отличается от любого другого * nix, над которым я работал.

Есть ли способ изменить это и сделать cp -r folderA / копировать папку вместо ее содержимого?

Есть основания полагать, что такое поведение имеет больше смысла (и я считаю, что оно используется rsync, даже в GNU / Linux). Рассмотрим следующий случай:

 mydir
   |-.fileA
   |-fileB

Семантика этих трех спецификаторов различна:

 cp -r mydir   dest/   # creates dest/mydir, containing both files
 cp -r mydir/  dest/   # copies both files directly into dest
 cp -r mydir/* dest/   # copies fileB, but not .fileA, directly into dest

Я считаю, что это пример различия между BSD и GNU. Вы можете установить инструменты со вкусом GNU, используя финк (видеть пакет coreutils), но они могут не сохранить все метаданные HFS +, поэтому будьте осторожны.

Вы можете перехватить команду и удалить косую черту в конце. Я оставлю это в качестве упражнения для читателя или других ответивших.

Вы можете изменить поведение при завершении табуляции, чтобы косая черта не добавлялась. Добавьте следующее в свой ~/.tcshrc:

 unset addsuffix

Вы можете добиться аналогичного эффекта в утилитах bash и misc readline, добавив в свой ~/.inputrc:

 set mark-directories off

Без ручного удаления символа '/' при установке по умолчанию? К сожалению, не так, как указано в Дарвине от Apple. страница руководства для cp: «Если исходный_файл заканчивается на /, копируется содержимое каталога, а не самого каталога». Похоже, это часть замысла Дарвина. cp.

Однако можно отключить addsuffix переменная оболочки в tcsh чтобы исключить добавление '/' в каталоги. Большой недостаток в том, что теперь очень сложно определить, имеете ли вы дело с каталогом или файлом, сразу после завершения. Для этого введите в командной строке (или добавьте в свой .tcshrc):

 unset addsuffix

Для bash вы можете использовать mark-directories настройка. Вы можете ввести следующее или добавить его в свой .bashrc:

 bind 'set mark-directories off'

Источник для использования mark-каталогов: Форумы MacNN: Hal Itosis

«Вы можете перехватить команду и убрать косую черту в конце. Я оставлю это в качестве упражнения для читателя или других респондентов». Добавление

function cp() { /bin/cp $(echo "$*" | sed 's|/ | |g'); }

to ~ / .bashrc, похоже, помогает.