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