Я предполагаю, что вы хотите, чтобы все скопированные файлы оказались в одном месте.
Похоже, вы хотите, чтобы все файлы в /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 {}
чтобы скопировать каталоги, которые соответствуют шаблону поиска).