6

Как использовать команду 'cp' для исключения определенной директории?

7

Я хочу скопировать все файлы в директории, за исключением некоторых файлов в конкретной подпапке. Я заметил, что команда cp не имеет опции --exclude. Как мне это сделать?

5 ответ(ов)

11

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 из командной строки.

0

Использование rsync вместо команды find с cp имеет несколько явных преимуществ:

  1. Производительность: rsync оптимизирован для синхронизации файлов, и он может быстрее обрабатывать большие объемы данных, поскольку сравнивает содержимое файлов, а не просто их имена.

  2. Дельта-копирование: Если файлы уже есть в целевой папке, rsync будет копировать только изменения, а не весь файл, что значительно экономит время и пропускную способность.

  3. Обработка ошибок: rsync предоставляет более эффективные механизмы обработки ошибок и позволяет продолжать операцию после сбоя, в то время как find с cp может остановиться при первой возникшей ошибке.

  4. Управление конфликтами: С помощью rsync можно легко разрешать конфликты, например, при перезаписи файлов, с помощью различных опций, таких как --ignore-existing или --update.

  5. Сжатие и шифрование: rsync поддерживает сжатие данных при передаче с помощью опции -z, что может уменьшить объем передаваемой информации и ускорить процесс, особенно по медленным сетям.

  6. Поддержка удаленных операций: rsync может работать не только с локальными, но и с удаленными источниками и назначениями, что делает его мощным инструментом для бэкапа и переноса данных.

Таким образом, хотя find . -exec cp ... может работать для простых задач копирования, rsync предлагает многие дополнительные функции и оптимизации, которые делают его предпочтительным инструментом для синхронизации файлов и каталогов.

0

Команда, которую вы указали, копирует все файлы и каталоги из текущего рабочего каталога в домашнюю директорию пользователя, исключая те, которые начинаются с буквы "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/ \;

Этот вариант более надежен и избегает проблем с пробелами и специальными символами в названиях файлов.

0

Самый простой способ, который я нашел, позволяет вам скопировать все файлы, исключая определенные файлы и папки, просто добавив их имена в круглые скобки. Вот пример команды:

shopt -s extglob
cp -r !(Filename1 | FoldernameX | Filename2) Dest/

В этом примере Filename1, FoldernameX и Filename2 — это имена файлов и папок, которые вы хотите исключить из копирования. Опция shopt -s extglob активирует расширенные шаблоны, которые позволяют использовать такие конструкции. Убедитесь, что вы выполняете команду в нужной директории, чтобы файлы были корректно скопированы в папку Dest/.

0

Это относительный путь относительно исходной директории.

Данная команда исключает директорию source/.git из копирования.

rsync -r --exclude '.git' source target
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь