Как использовать команду '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: Копирование и создание директории назначения, если она не существует
Как заставить команду cp создавать необходимые папки для копирования файла в папку назначения
Как изменить цвет вывода echo в Linux
Как работает "cat << EOF" в bash?
Как создать файл в Linux из терминала? [закрыто]