Таким чином, ви можете використовувати *
знак підключення для всіх файлів при використанні cp
в контексті каталогу. Чи є спосіб скопіювати всі файли, крім x
файлу?
Таким чином, ви можете використовувати *
знак підключення для всіх файлів при використанні cp
в контексті каталогу. Чи є спосіб скопіювати всі файли, крім x
файлу?
Відповіді:
У bash
ви можете використовувати extglob
:
$ shopt -s extglob # to enable extglob
$ cp !(b*) new_dir/
де !(b*)
виключити всі b*
файли.
Пізніше ви можете відключити за extglob
допомогою
$ shopt -u extglob
find
це єдиний спосіб tcsh
:find . -maxdepth 1 ! -name "exclude*" -exec cp -t destination {} \+
Rsync прекрасно справляється з цим.
Приклад копіювання всіх: rsync -aP /folder1/* /folder/2
Приклад копіювання всіх із виключенням: rsync -aP --exclude=x /folder1/* /folder2/
-aP
перемикач:
a: Подібно до cp -a
, рекурсивного тощо. P: Показує прогрес, приємна особливість rsync.
-rP
замість, -aP
якщо ви хочете повторити. -a
призначено для архівування. Не впевнений, чи це змінилося, чи це просто інше на MacOS.
rsync
має можливість зробити це рекурсивним. Приклад: rsync --recursive -P --exclude=x /folder1/* /folder2/
. (Тестовано лише на Ubuntu)
Це не особливість cp
, це особливість вашої оболонки (вона розширює, *
щоб означати всі неточні файли), тому відповідь залежить від того, яку оболонку ви використовуєте. Наприклад, zsh
підтримує цей синтаксис:
$ cp ^x /path/to/destination
Де ^x
означає "всі файли, крім x
"
Ви також можете комбінувати схеми вибору та де-виділення, наприклад, для копіювання всіх файлів WAV, крім тих, що містять xyz, ви можете використовувати:
cp *.wav~*xyz*
bash
?
Можна також виконати звичайну стару (портативну / сумісну) обробку Bourne різними способами зі стандартними інструментами набагато менш елегантними способами, ніж використання вдосконалених обшивок оболонок або команд із вбудованими параметрами виключення.
Якщо файлів не надто багато (і не з іменами, включаючи пробіли та / або рядкові перерви), це може бути таким чином:
cp `ls | egrep -v '^excludename$'` destdir/.
Звичайно, bash
інструменти GNU - чудові та потужні, але вони все ще не завжди доступні. Якщо ви маєте намір помістити його в портативний сценарій, я б рекомендував, find
як у коментарі Rush.
Якщо ви хочете скопіювати все в папку (включаючи підпапки) у певний підкаталог:
cp -R $(ls | grep -v '^subdir$') subdir/
Працює з sh, bash, zsh (принаймні).
cp -R * subdir/
cp
(не від bash
/ sh
), " cp: cannot copy a directory, ‘subdir’, into itself, ‘subdir/subdir’
". Однак копія виконується правильно. На жаль, ваш варіант поєднується з будь-яким ім'ям файлу, що містить пробіл чи розділові знаки для оболонки. Дивіться unix.stackexchange.com/q/128985/135943
extglob
Я вважаю, що це найкращий спосіб.
Інший спосіб - використання
cp $(ls --ignore=x) subdir/
$
ін.) Ніколи не аналізуйте вихідні дані ls
. unix.stackexchange.com/q/128985/135943