Как скопировать файл в несколько каталогов одной командой в 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
Как это работает:
- 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).
- Нет незавершённых операций при аварийном завершении скрипта.

Отказоустойчивость и крайние случаи
- Если одна из целей недоступна (например, внешний диск отключён), команда cp вернёт ошибку, но xargs может продолжить для остальных целей. Чтобы остановить при первой ошибке, используйте цикл for и проверяйте код возврата.
- При параллельном копировании следите за нагрузкой на диск и сеть.
- При работе с критичными данными сначала выполняйте dry-run (для rsync есть –dry-run).
Краткие подсказки и команды справки
Введите man echo, man xargs, или man cp в командной строке для подробной информации. Для rsync используйте man rsync.
Итоги
- xargs + cp — быстрый способ выполнить многократное копирование одной строкой.
- Для путей с пробелами или безопасной обработки — используйте NUL-терминирование или цикл for.
- Для сетевых и больших копий рассматривайте rsync.
Важно: перед массовыми операциями всегда сделайте резервную копию или проверьте команды на тестовой директории.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента