Гид по технологиям

Как скопировать файл в несколько каталогов одной командой в Linux

• 4 min read • Linux • Обновлено 26 Nov 2025
Скопировать файл в несколько каталогов одной командой
Скопировать файл в несколько каталогов одной командой

Как скопировать файл в несколько каталогов одной командой в Linux

Копирование файла в Linux через командную строку обычно просто: команда cp указывает исходный файл и директорию назначения. Но если нужно скопировать один и тот же файл в несколько мест, запускать cp по одному разу для каждой директории неудобно. Ниже — проверенные способы выполнить это одной строкой, с объяснениями, советами по надёжности и альтернативами.

Быстрое решение с xargs

Исходная идея — передать список директорий в xargs, чтобы он запускал cp для каждой из них.

echo dir1 dir2 dir3 | xargs -n 1 cp file1

Пример на реальных путях:

echo ~/TextFiles/ ~/Dropbox /media/lori/MYUSBDRIVE | xargs -n 1 cp ~/Documents/FileToBeCopied.txt

Ввод команды cp три раза

Как это работает:

  • echo выводит список директорий.
  • Символ | (pipe) направляет этот вывод в xargs.
  • xargs запускает команду cp, подставляя по одному аргументу из потока (опция -n 1).

Важно: если в целевой директории уже есть файл с тем же именем, он будет перезаписан без подтверждения.

Защита от перезаписи и большие файлы

Если вы не хотите перезаписывать существующие файлы (особенно если файл большой или копирование идёт по сети), добавьте опцию -n к cp (no-clobber):

echo ~/TextFiles/ ~/Dropbox /media/lori/MYUSBDRIVE | xargs -n 1 cp -n ~/Documents/FileToBeCopied.txt

Использование одной команды для копирования

Примечание: опция -i (interactive) для cp не подходит при использовании с xargs, так как она требует интерактивного ввода при выполнении.

Проблемы с пробелами в именах путей и устойчивое решение

Команды выше разобьют аргументы по пробелам, поэтому пути с пробелами не будут работать корректно. Для надёжной передачи путей используйте NUL-терминированный список и опцию -0 у xargs.

Пример с printf:

printf '%s\0' "~/Text Files" "~/Dropbox" "/media/lori/MY USB DRIVE" | xargs -0 -n 1 cp -- ~/Documents/FileToBeCopied.txt

Или создайте файл со списком путей (каждая строка — одна директория) и примените:

# paths.txt содержит по одной директории в строке
cat paths.txt | tr '\n' '\0' | xargs -0 -n 1 cp -- ~/Documents/FileToBeCopied.txt

Флаг – для cp защищает от случаев, когда имя директории начинается с дефиса.

Альтернативы и когда использовать их

  • Цикл for (простой и читаемый):
for d in ~/TextFiles ~/Dropbox /media/lori/MYUSBDRIVE; do
  cp ~/Documents/FileToBeCopied.txt "$d"
done
  • xargs с шаблоном (-I):
echo ~/TextFiles ~/Dropbox /media/lori/MYUSBDRIVE | xargs -n 1 -I {} cp ~/Documents/FileToBeCopied.txt {}
  • rsync — эффективно при копировании по сети и при частых обновлениях (поддерживает возобновление, сжатие, проверку целостности):
rsync -av --progress ~/Documents/FileToBeCopied.txt user@remote:/path/to/dest/
  • parallel — если хотите распараллелить копирование на многопроцессорной станции:
echo dir1 dir2 dir3 | tr ' ' '\n' | parallel cp ~/Documents/FileToBeCopied.txt {}

Когда что выбрать — краткая подсказка:

  • Несколько локальных директорий без пробелов: xargs удобен.
  • Пути с пробелами или сложные имена: используйте NUL-терминирование или цикл for с кавычками.
  • Сеть или большие файлы с повторяющимися обновлениями: используйте rsync.
  • Много целей и хотите ускорить: GNU parallel.

Примеры и вариации

Копирование по списку из файла (каждая строка — путь):

while IFS= read -r dir; do
  cp -n ~/Documents/FileToBeCopied.txt "$dir"
done < paths.txt

Использование cp с целевой директорией -t (удобно с xargs):

echo dir1 dir2 dir3 | xargs -n 1 -I {} cp ~/Documents/FileToBeCopied.txt -t {}

Модель принятия решения (когда выбирать метод)

flowchart TD
  A[Нужно скопировать файл в несколько директорий?] --> B{Локальные директории}
  B -- Да --> C{Пробелы в путях?}
  B -- Нет --> D[Используйте rsync]
  C -- Нет --> E[Используйте xargs или for]
  C -- Да --> F[Используйте NUL-терминирование или for с кавычками]
  E --> G[Добавьте -n для no-clobber при необходимости]
  F --> G

Роль‑ориентированные чеклисты

  • Для системного администратора:

    • Проверьте права доступа на директории назначения.
    • Используйте rsync для сетевых копий.
    • Логируйте результат (stdout/stderr) в файл.
  • Для обычного пользователя:

    • Проверьте, нет ли пробелов в путях; если есть — используйте кавычки.
    • Подумайте о -n, чтобы не тратить трафик при перезаписи.
  • Для разработчика/скриптера:

    • Обрабатывайте ошибки (set -e или проверка кода возврата).
    • Используйте абсолютные пути или нормализуйте их через realpath.

Критерии приёмки

  • Файл присутствует во всех указанных директориях.
  • Там, где файл уже был, он либо обновлён намеренно, либо сохранён (в зависимости от опций -n/-i).
  • Нет незавершённых операций при аварийном завершении скрипта.

Одна команда с опцией no-clobber (‑n)

Отказоустойчивость и крайние случаи

  • Если одна из целей недоступна (например, внешний диск отключён), команда cp вернёт ошибку, но xargs может продолжить для остальных целей. Чтобы остановить при первой ошибке, используйте цикл for и проверяйте код возврата.
  • При параллельном копировании следите за нагрузкой на диск и сеть.
  • При работе с критичными данными сначала выполняйте dry-run (для rsync есть –dry-run).

Краткие подсказки и команды справки

Введите man echo, man xargs, или man cp в командной строке для подробной информации. Для rsync используйте man rsync.

Итоги

  • xargs + cp — быстрый способ выполнить многократное копирование одной строкой.
  • Для путей с пробелами или безопасной обработки — используйте NUL-терминирование или цикл for.
  • Для сетевых и больших копий рассматривайте rsync.

Важно: перед массовыми операциями всегда сделайте резервную копию или проверьте команды на тестовой директории.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро