É possível copiar um único arquivo para vários diretórios usando o comando cp?
Eu tentei o seguinte, que não funcionou:
cp file1 /foo/ /bar/
cp file1 {/foo/,/bar}
Eu sei que é possível usar um loop for ou find. Mas é possível usar o comando gnu cp?
Você não pode fazer isso
cp
sozinho, mas pode combinarcp
comxargs
:Irá copiar
file1
paradir1
,dir2
edir3
.xargs
chamarácp
três vezes para fazer isso, consulte a página de manual paraxargs
obter detalhes.fonte
cp
sozinho" Só porque a resposta tentou ser útil sugerindo outra maneira não significa que a pergunta não foi respondida.echo dir[1-3] | xargs -n 1 cp filename
).Os curingas também funcionam com o código Roberts
fonte
Tanto quanto eu posso ver, você pode usar o seguinte:
A
-i
opção decp
comando significa que você será perguntado se deseja substituir um arquivo no diretório atual com ofile.dat
. Embora não seja uma solução completamente automática, funcionou para mim.fonte
-i
proteção, isso não o levará a escrever todos os arquivos? em vez de copiar para os diretórios?cp: overwrite
perguntas, mas não precisei responder nenhuma delas e não substitui os arquivos.Eu usaria
cat
e comtee
base nas respostas que vi em /superuser/32630/parallel-file-copy-from-single-source-to-multiple-targets em vez decp
.Por exemplo:
fonte
cat <inputfile> | tee /path-to-files/outfile{1..4} > /dev/null
tee < inputfile outfile1 outfile2 > /dev/null
também é um padrão útil, como mostra a resposta de Taywee. Observe o uso do redirecionamento io com '<' para que a tubulação do gato não seja necessária.Todas essas respostas parecem mais complicadas que o óbvio:
fonte
for d in */ ; do cp $file "$i" done
ls -db di*/subdir | xargs -n 1 cp File
-b
no caso de haver um espaço no nome do diretório, caso contrário, ele será quebrado como um item diferente pelo xargs; este problema ocorreu com a versão echofonte
Não usando cp per se, mas ...
Isso surgiu para mim no contexto de copiar muitas imagens Gopro de um cartão SD (lento) para três unidades USB (lentas). Eu queria ler os dados apenas uma vez, porque demorou uma eternidade. E eu queria que fosse recursivo.
(E você pode adicionar mais dessas seções> () se desejar mais saídas.)
Eu não comparei isso, mas é definitivamente muito mais rápido que o cp-in-a-loop (ou várias invocações paralelas de cp).
fonte
Para usar a cópia
xargs
em diretórios usando curingas no Mac OS, a única solução que funcionou para mim com espaços no nome do diretório é:Onde
test
está o arquivo para copiare
./fs*/*
os diretórios para copiarO problema é que o xargs vê os espaços como um novo argumento, as soluções para alterar o caractere delimitador usando
-d
ou-E
infelizmente não está funcionando corretamente no Mac OS.fonte
Se você quiser fazer isso sem um comando bifurcado:
tee <inputfile file2 file3 file4 ... >/dev/null
fonte
Essencialmente equivalente à resposta xargs, mas caso você queira uma execução paralela:
Portanto, por exemplo, para copiar o arquivo1 em todos os subdiretórios da pasta atual (incluindo recursão):
NB: Provavelmente isso só transmite ganhos de velocidade perceptíveis para casos de uso muito específicos, por exemplo, se cada diretório de destino for um disco distinto.
Também é funcionalmente semelhante ao argumento '-P' para xargs.
fonte
Não, você não pode.
Descobri em várias ocasiões que poderia usar essa funcionalidade, por isso criei minha própria ferramenta para fazer isso por mim.
http://github.com/ddavison/branch
bem simples -
branch myfile dir1 dir2 dir3
fonte
/e
por exemplo, apenas uma vez em cada máquina, eu poderia escrever minhas próprias ferramentas e mantê-las para sempre.fonte
Suponha que você queira copiar
fileName.txt
para todos os subdiretórios do diretório de trabalho atual.Obtenha todos os nomes dos subdiretórios
ls
e salve-os em algum arquivo temporário, por exemplo,allFolders.txt
Imprima a lista e passe-a para o comando
xargs
.fonte
Outra maneira é usar gato e camiseta da seguinte maneira:
Eu acho que isso seria bastante ineficiente, pois o trabalho seria dividido entre vários processos (um por destino) e o disco rígido gravaria vários arquivos de uma só vez em diferentes partes do prato. No entanto, se você quiser gravar um arquivo em várias unidades diferentes, esse método provavelmente será bastante eficiente (pois todas as cópias podem ocorrer simultaneamente).
fonte
Usando um script bash
fonte
se você deseja copiar várias pastas para várias, pode-se fazer algo assim:
eco dir1 dir2 dir3 | xargs -n 1 cp -r / caminho / toyourdir / {subdir1, subdir2, subdir3}
fonte
Se todos os seus diretórios de destino corresponderem a uma expressão de caminho - como se todos fossem subdiretórios
path/to
-, use-osfind
em combinação comcp
:É isso aí.
fonte
find
thread.Se precisar especificar em quais pastas copiar o arquivo, é possível combinar a localização com um ou mais greps. Por exemplo, para substituir quaisquer ocorrências do favicon.ico em qualquer subpasta, você pode usar:
fonte
Isso será copiado para os subdiretórios imediatos. Se você quiser ir mais fundo, ajuste o
-maxdepth
parâmetro.Se você não deseja copiar para todos os diretórios, esperamos poder filtrar os diretórios nos quais não está interessado. Exemplo de cópia para todas as pastas começando com
a
Se você copiar para um conjunto arbitrário / separado de diretórios, precisará da sugestão de Robert Gamble.
fonte
Eu gosto de copiar um arquivo em vários diretórios como tal:
cp file1 /foo/; cp file1 /bar/; cp file1 /foo2/; cp file1 /bar2/
E copiar um diretório em outros diretórios:cp -r dir1/ /foo/; cp -r dir1/ /bar/; cp -r dir1/ /foo2/; cp -r dir1/ /bar2/
Eu sei que é como emitir vários comandos, mas funciona bem para mim quando eu quero digitar 1 linha e ir embora por um tempo.
fonte
Por exemplo, se você estiver no diretório pai das suas pastas de destino, poderá:
para i em $ (sl); faça cp sourcefile $ i; feito
fonte
ls
e sempre cite variáveis.for i in ./*; do cp sourcefile "$i"; done