Как использовать команду 'cp' для исключения определенной директории?
Я хочу скопировать все файлы в директории, за исключением некоторых файлов в конкретной подпапке. Я заметил, что команда cp
не имеет опции --exclude
. Как мне это сделать?
5 ответ(ов)
rsync
быстрый и удобный инструмент:
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude
Вы можете использовать --exclude
несколько раз.
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude
Обратите внимание, что каталог thefoldertoexclude
, указанный после опции --exclude
, является относительным по отношению к sourcefolder
, т.е. sourcefolder/thefoldertoexclude
.
Также вы можете добавить -n
для имитации выполнения, чтобы увидеть, что будет скопировано, прежде чем выполнять реальную операцию. Если все в порядке, просто уберите -n
из командной строки.
Использование rsync
вместо команды find
с cp
имеет несколько явных преимуществ:
Производительность:
rsync
оптимизирован для синхронизации файлов, и он может быстрее обрабатывать большие объемы данных, поскольку сравнивает содержимое файлов, а не просто их имена.Дельта-копирование: Если файлы уже есть в целевой папке,
rsync
будет копировать только изменения, а не весь файл, что значительно экономит время и пропускную способность.Обработка ошибок:
rsync
предоставляет более эффективные механизмы обработки ошибок и позволяет продолжать операцию после сбоя, в то время какfind
сcp
может остановиться при первой возникшей ошибке.Управление конфликтами: С помощью
rsync
можно легко разрешать конфликты, например, при перезаписи файлов, с помощью различных опций, таких как--ignore-existing
или--update
.Сжатие и шифрование:
rsync
поддерживает сжатие данных при передаче с помощью опции-z
, что может уменьшить объем передаваемой информации и ускорить процесс, особенно по медленным сетям.Поддержка удаленных операций:
rsync
может работать не только с локальными, но и с удаленными источниками и назначениями, что делает его мощным инструментом для бэкапа и переноса данных.
Таким образом, хотя find . -exec cp ...
может работать для простых задач копирования, rsync
предлагает многие дополнительные функции и оптимизации, которые делают его предпочтительным инструментом для синхронизации файлов и каталогов.
Команда, которую вы указали, копирует все файлы и каталоги из текущего рабочего каталога в домашнюю директорию пользователя, исключая те, которые начинаются с буквы "c". Давайте разберём её по частям:
ls -A
— выводит список всех файлов и каталогов в текущей директории, включая скрытые (начинающиеся с точки), но без.
и..
.grep -v "c"
— фильтрует вывод, исключая строки, содержащие букву "c".- Команда в обратных кавычках (
`...`
) позволяет выполнить её результат как часть другой команды. В данном случае, это список файлов и директорий, которые вы хотите скопировать. cp -r
— это команда для рекурсивного копирования. Ключ-r
означает, что команда будет копировать директории и их содержимое.$HOME/
— указывает на домашнюю директорию пользователя.
Таким образом, эта команда копирует все файлы и директории из текущей директории, исключая те, которые содержат букву "c", в домашнюю директорию.
Важно: Использование команд с обратными кавычками недопустимо в современных скриптах. Лучше использовать конструкцию с $(...)
, например:
cp -r $(ls -A | grep -v "c") $HOME/
Также стоит учитывать, что если в именах файлов встречаются пробелы или специальные символы, такой подход может привести к ошибкам. Для более безопасного копирования можно использовать find
. Например:
find . -maxdepth 1 ! -name "c*" -exec cp -r {} $HOME/ \;
Этот вариант более надежен и избегает проблем с пробелами и специальными символами в названиях файлов.
Самый простой способ, который я нашел, позволяет вам скопировать все файлы, исключая определенные файлы и папки, просто добавив их имена в круглые скобки. Вот пример команды:
shopt -s extglob
cp -r !(Filename1 | FoldernameX | Filename2) Dest/
В этом примере Filename1
, FoldernameX
и Filename2
— это имена файлов и папок, которые вы хотите исключить из копирования. Опция shopt -s extglob
активирует расширенные шаблоны, которые позволяют использовать такие конструкции. Убедитесь, что вы выполняете команду в нужной директории, чтобы файлы были корректно скопированы в папку Dest/
.
Это относительный путь относительно исходной директории.
Данная команда исключает директорию source/.git
из копирования.
rsync -r --exclude '.git' source target
Linux: Копирование и создание директории назначения, если она не существует
Как изменить цвет вывода echo в Linux
Как работает "cat << EOF" в bash?
Как использовать 'grep' для непрерывного потока?
Найти и завершить процесс в одну строку с помощью bash и regex