копирование нескольких файлов в несколько каталогов

У меня проблема с копированием многих файлов в разных каталогах. Позвольте мне объяснить лучше:

Скажем, у меня есть следующее в каталоге:

$ ls file1 file2 file3 file4 file5 dir1 dir2 dir3 

и я хочу скопировать каждый файл * в каждый каталог * с помощью одной команды. Я пробовал:

  echo dir{1..3} | xargs cp file{1..5} '{}' \; 

Мое намерение состояло в том, чтобы сказать xargs обрабатывать каждый отдельный dir * от эха и копировать все файлы на обработанном входе, но это и подобное не сработало. Я хотел бы избежать использования сценария, потому что это задача, которую я должен повторить примерно для 20 каталогов, а имена файлов несколько разные, поэтому я предпочел бы изменить команду, а не скрипт.

4 Solutions collect form web for “копирование нескольких файлов в несколько каталогов”

echo dir[1-3] | xargs -r -n1 cp file[1-5]

Вы делаете небольшую ошибку в использовании xargs. Без параметра -n xargs добавляет все параметры во входные данные для команды, а echo dir{1..3} не добавит необходимого возврата каретки между каждой записью, поэтому xargs рассмотрит результат как один параметр.

xargs имеет опцию -n, которая может ограничить количество записей, и вам нужно перечислить каталоги с помощью \ n или \ 0 в качестве разделителя:

 find . -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 -n 1 cp file{1..5} 

Команда find будет искать все каталоги в текущем и использовать разделитель \ 0 в качестве разделителя (который работает лучше, если у вас есть каталоги с пробелами), а xargs использует разделитель \ 0 как разделитель и запускает команду каждый раз только с одним параметром.

Что-то вроде следующего должно работать, если у них действительно есть такие имена:

 #!/bin/bash shopt -s nullglob for dir in dir*/; do cp file* "$dir" done 

Если вы хотите скопировать все файлы во все каталоги, независимо от имени:

 #!/bin/bash shopt -s nullglob dotglob for dir in */; do for file in *; do [[ -f $file ]] && cp "$file" "$dir" done done 

Ты почти там. Вам нужно запустить отдельную команду cp для каждого целевого каталога, потому что cp делает только одну копию каждого исходного файла. Основная цель xargs – запустить одну команду над несколькими аргументами, но вы можете сказать ей передать один элемент за раз с параметром -n . Также {} ; является синтаксисом find … -exec ; вам не нужно (и не использовать) с помощью xargs .

 echo dir{1..3} | xargs -n 1 cp file{1..5} 

Обратите внимание, что это работает только в том случае, если имена ваших каталогов не содержат пробелов или каких-либо символов \'" , потому что xargs не может сказать, что эти символы являются частью имен файлов, а не цитируют и не разделяют входные файлы. не имеет такой проблемы, заключается в использовании цикла оболочки:

 for d in dirs{1..3}; do cp file{1..5} "$d" done 

Все это предполагает, что вы можете легко различать файлы и каталоги по их именам. Если вы не можете, вы можете сопоставить каталоги, добавив / в конец; например, */ соответствует всем каталогам в текущих каталогах, foo[0-9]*/ соответствует всем каталогам, чье имя начинается с foo и цифрой и т. д. Подобного метода не подходит для сопоставления только не-каталогов в большинстве оболочек, но если вы передаете каталоги в cp без аргумента, чтобы сообщить ему сделать рекурсивную копию, каталоги игнорируются с сообщением об ошибке.

 for d in */; do cp * "$d" done 

В zsh вы можете использовать квалификаторы glob для соответствия только определенным типам файлов.

 for d in *(/); do cp *(.) $d done 
  • Как правильно использовать параллель в этой ситуации?
  • Почему xargs -I подразумевает -L 1
  • Как сделать `head` и` tail` на вход с нулевым ограничением в bash?
  • Различное поведение между find -exec и piping через xargs
  • Запись zsh и вывод на другую команду
  • Выполнение одной и той же команды с разными аргументами параллельно
  • Объединение bash% с xargs%
  • найти . . * -тип f -print0 | xargs -0 sudo chmod 664; не работает
  • xargs не генерирует правильную команду
  • Найдите строку в файле и переименуйте несколько файлов в результаты
  • git checkout конкретные файлы
  • Linux и Unix - лучшая ОС в мире.