Я предполагаю, что вы хотите, чтобы все скопированные файлы оказались в одном месте.
Похоже, вы хотите, чтобы все файлы в /path /to /$ работали, где имя файла начинается со строки из файла board, которая будет скопирована в какой-либо пункт назначения.
например, дано
$ cat boards
start1
start2
$ ls $work
start1.txt
start1.jpg
start2.txt
start2.jpg
start3.txt
$
Вы хотите, чтобы start1.txt, start1.jpg, start2.txt и start2.jpg были скопированы куда-либо, но не start3.txt.
Не используйте xargs: это фантастический инструмент, но он будет вызывать проблемы, если в любом из ваших файлов или "шаблонов поиска" будут пробелы или символы глобуса (например, «*»).
Скорее используйте инструмент, который ожидает шаблон поиска, найти.
cat boards | while read pattern
find $work -name "${pattern}*" -exec cp {} /path/to/destination +
done
Это будет читать в каждой строке boards как шаблон поиска. find затем заглянет в каталог $work чтобы найти файлы (и папки!) которые соответствуют ${pattern}* ; каждый найденный элемент (файл или папка) будет передан в cp как правильно экранированный параметр (в месте {} ), и он будет выполнять xargs минимизацию числа процессов cp он запускает из-за + (если вы Если вы хотите использовать только один процесс для каждого найденного элемента, вы должны использовать его ;
find имеет богатый набор фильтров, которые вы можете применить, чтобы сузить область поиска. Особого внимания заслуживает опция -type f которая ограничивает результаты в файле.
Обратите внимание, что команда cp может завершиться неудачно, если в списке аргументов переданы команды find из папок; использование фильтра -type f предотвратит это.
Также обратите внимание, что команда cp "сгладит" выходной каталог - если в $work есть подкаталоги, в которых совпадают файлы, эти файлы будут скопированы прямо в /path/to/destination . Если вы хотите копировать файлы только на верхнем уровне $work , фильтр -maxdepth (вероятно, со значением 1: -maxdepth 1) предотвратит повторное find поиска в глубине файловой системы.
Обратите внимание, что при find учитывается регистр. Если вы этого не хотите, вы можете использовать -iname вместо -name для поиска без учета регистра.
Если есть какие-либо другие параметры командной строки, которые вы хотите передать cp , просто поместите их перед {} (например, cp -r {} чтобы скопировать каталоги, которые соответствуют шаблону поиска).