Таким чином, ви можете використовувати *знак підключення для всіх файлів при використанні 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