В терминале (с использованием 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, похоже, помогает.