Seu único erro não é o echoque não deveria estar lá e o $1que deveria estar $i?
Julie Pelletier
se eu remover o eco e usar apenas test$1.ogg, ele diz: test.ogg e test.ogg são os mesmos arquivos , então parece que $ 1 não é reconhecido?
Preto
@ EdwardBlack: Parece que eu entendi mal suas necessidades. Essa solução não é adequada.
cuonglm
@JuliePelletier, droga, às vezes acontece comigo que eu escrevo acidentalmente em $1vez de $i, é cedo pela manhã, desculpe ... obrigado. Vou usar $xno futuro, em vez de$i
Preto
Respostas:
25
Seu código do shell tem dois problemas:
O echonão deveria estar lá.
A variável $iestá digitada incorretamente como $1no nome do arquivo de destino.
Para fazer uma cópia de um arquivo no mesmo diretório que o próprio arquivo, use
cp thefile thecopy
Se você inserir mais alguma coisa, por exemplo,
cp thefile theotherthing thecopy
assume-se que você deseja copiar thefilee theotherthingpara o diretório chamado thecopy.
No seu caso, ele procura especificamente um arquivo chamado test.ogge um nomeado echopara copiar para o diretório test$1.ogg.
O $1mais provável será expandir para uma sequência vazia. É por isso que, quando você exclui o echocomando, você obtém "test.ogg e test.ogg são os mesmos arquivos"; o comando que está sendo executado é essencialmente
Nota: Isso provavelmente funcionaria para 100 cópias, mas para milhares de cópias pode gerar um erro "lista de argumentos muito longa". Nesse caso, volte a usar um loop.
como sugerido por @Gilles, usar teetem o defeito de não preservar nenhum metadado de arquivo. Para superar esse problema, talvez seja necessário executar o comando abaixo:
Isso é potencialmente mais rápido do que várias chamadas para cp(depende do tamanho do arquivo em relação à memória disponível), mas tem o defeito de não preservar nenhum metadado do arquivo.
Gilles 'SO- stop be evil' -
@ Gilles ohh, podemos superar isso?
Rahul
3
Você pode correr cp --attributes-onlydepois.
Gilles 'SO- stop be evil'
@Gilles obrigado, atualizei minha resposta conforme sua ajuda.
Rahul
FWIW nenhuma das outras respostas usadas cp -ppara preservar os metadados.
roaima 6/06
11
for i in{1..100};do cp test.ogg "test_$i.ogg";done
É o mesmo que as duas respostas anteriores e um comentário, exceto (1) a pergunta faz cerca de 100, e sua resposta usa 10, (2) você adicionou desnecessariamente as -rvfopções cpe (3) você não citou sua expansão variável . (Observe também que é convencional ter um espaço entre símbolos de pontuação como ;e a palavra a seguir.) A adição da -popção é valiosa, mas (4a) já foi abordada (nos comentários) e (4b) sua resposta não é útil se você não explicar o que está fazendo.
echo
que não deveria estar lá e o$1
que deveria estar$i
?test$1.ogg
, ele diz: test.ogg e test.ogg são os mesmos arquivos , então parece que $ 1 não é reconhecido?$1
vez de$i
, é cedo pela manhã, desculpe ... obrigado. Vou usar$x
no futuro, em vez de$i
Respostas:
Seu código do shell tem dois problemas:
echo
não deveria estar lá.$i
está digitada incorretamente como$1
no nome do arquivo de destino.Para fazer uma cópia de um arquivo no mesmo diretório que o próprio arquivo, use
Se você inserir mais alguma coisa, por exemplo,
assume-se que você deseja copiar
thefile
etheotherthing
para o diretório chamadothecopy
.No seu caso, ele procura especificamente um arquivo chamado
test.ogg
e um nomeadoecho
para copiar para o diretóriotest$1.ogg
.O
$1
mais provável será expandir para uma sequência vazia. É por isso que, quando você exclui oecho
comando, você obtém "test.ogg e test.ogg são os mesmos arquivos"; o comando que está sendo executado é essencialmenteProvavelmente é um erro de digitação.
No final, você quer algo como isto:
Ou, como alternativa
Ou, usando
tee
:Nota: Isso provavelmente funcionaria para 100 cópias, mas para milhares de cópias pode gerar um erro "lista de argumentos muito longa". Nesse caso, volte a usar um loop.
fonte
Curto e preciso
ou melhor ainda
consulte uso do comando tee para obter mais ajuda.
Atualizar
como sugerido por @Gilles, usar
tee
tem o defeito de não preservar nenhum metadado de arquivo. Para superar esse problema, talvez seja necessário executar o comando abaixo:fonte
cp
(depende do tamanho do arquivo em relação à memória disponível), mas tem o defeito de não preservar nenhum metadado do arquivo.cp --attributes-only
depois.cp -p
para preservar os metadados.fonte
O comando a seguir copiará o arquivo.a 5 vezes:
Se você preferir dd (não é o mesmo que cp!):
fonte
Você não chamou a variável i ao copiar
use o script abaixo. Como testado, funcionou bem
fonte
-rvf
opçõescp
e (3) você não citou sua expansão variável . (Observe também que é convencional ter um espaço entre símbolos de pontuação como;
e a palavra a seguir.) A adição da-p
opção é valiosa, mas (4a) já foi abordada (nos comentários) e (4b) sua resposta não é útil se você não explicar o que está fazendo.