Eu estou supondo que você quer que todos os arquivos copiados acabem no mesmo lugar.
Parece que você quer que todos os arquivos em / path / to / $ funcionem onde o nome do arquivo começa com uma linha do arquivo de placas a ser copiada para algum destino.
por exemplo, dado
$ cat boards
start1
start2
$ ls $work
start1.txt
start1.jpg
start2.txt
start2.jpg
start3.txt
$
você deseja que start1.txt, start1.jpg, start2.txt e start2.jpg sejam copiados para algum lugar, mas não para start3.txt.
Não use xargs: é uma ferramenta fantástica, mas causará problemas se algum dos seus arquivos ou "padrões de pesquisa" tiverem espaços ou caracteres glob (por exemplo, "*").
Em vez disso, use uma ferramenta que espera um padrão de pesquisa, encontre .
cat boards | while read pattern
find $work -name "${pattern}*" -exec cp {} /path/to/destination +
done
Isso será lido em cada linha de boards
como um padrão de pesquisa. find
procurará no diretório $work
para localizar arquivos (e pastas!) que correspondam a ${pattern}*
; cada item encontrado (arquivo ou pasta) será passado para cp como um parâmetro com escape adequado (no {}
spot), e fará xargs
- como a minimização do número de processos cp
iniciados devido a o +
(se você quisesse exatamente um processo por item encontrado, você usaria um ;
- certifique-se de escapar corretamente, no entanto).
find
tem um rico conjunto de filtros que você pode aplicar para restringir sua pesquisa. De particular interesse é a opção -type f
que limitará os resultados ao arquivo.
Observe que o comando cp
pode falhar se houver pastas na lista de argumentos transmitida de find
; usar o filtro -type f
impedirá isso.
Note também que o comando cp
irá "achatar" o diretório de saída - se $work
tiver subdiretórios que possuam arquivos correspondentes, esses arquivos serão copiados diretamente para /path/to/destination
. Se você deseja copiar apenas arquivos no nível superior de $work
, o filtro -maxdepth
(provavelmente com um valor de 1: -maxdepth 1
) impedirá que find
recorrer muito no sistema de arquivos.
Note também que find
faz distinção entre maiúsculas e minúsculas. Se você não quiser, use -iname
em vez de -name
para fazer uma pesquisa sem distinção entre maiúsculas e minúsculas.
Se houver qualquer outro parâmetro de linha de comando que você deseja atribuir a cp
, basta colocá-lo na frente do {}
(por exemplo, cp -r {}
para copiar diretórios que correspondam ao padrão de pesquisa).