Como passar a variável do resultado do comando find para dd


0

Estou tentando transferir o arquivo CentOS.iso para uma unidade flash USB usando o ddcomando passando uma variável que é resultado do comando find.

Eu quero passar variável assim

dd if=$isofile of=/dev/sdb

Primeiro eu preciso criar uma variável apropriada, então é assim que eu faço

isofile='find ~ -iname "*centos*minimal*.iso"'

No entanto, a saída da execução da variável criada

$isofile

não parece promissor. Eu não posso passar isso para o dd if=comando.

janela de terminal

Isso é possível de alcançar? Para passar variável para if=?

Na mesma nota, seria possível passar o findresultado do comando para -exec dd {}e transferir o .isoarquivo dessa maneira?


Coisa menor - supondo que seu comando isofile = tenha funcionado, você visualizaria seu conteúdo com "echo $ isofile", não $ isofile - o último tentará executar o conteúdo de $ isofile, em vez de exibir a variável.
davidgo

Depois de definir a variável com ticks errados, executá-la era uma coisa semi-certa a se fazer para conseguir algo . Não encontrou o arquivo porque find -inameobteve o argumento com aspas duplas literais. No caso de o comando executar "manualmente", o shell usava essas citações para saber o que fazer (e o que não fazer) com a string interna e, em seguida, passava a cadeia findsem elas.
Kamil Maciorowski

Nota: dd if="$isofile" …(citando!) É melhor. O espaço no nome do arquivo não quebrará o comando.
Kamil Maciorowski

Sim Kamil, aspas duplas para variáveis, você não vai me ver fazendo esse erro novamente.
Tomas.R

Respostas:


2

Você está usando o comando de escape errado. O comando que você está usando usando um único caractere enquote basicamente define toda a sua string de busca como uma string de letras. (Você pode ver isso digitando echo $ isofile). O que você quer fazer é executar isso e então fazer a saída em uma variável. Existem pelo menos 2 maneiras de fazer isso -

A maneira que você provavelmente pretendeu - que é usar backticks ao invés de avançar ticks, ie

  isofile=`find /home/tomas -iname "*centos*minimal*.iso"`

ou uma versão similar mais moderna

  isofile=$( find /home/tomas -iname "*centos*minimal*.iso" )

Ambos os itens acima têm o problema de se houver mais de 1 arquivo correspondente. Você pode consertar isso fazendo algo como o abaixo para pegar a primeira linha.

 isofile=$( find /home/tomas -iname "*centos*minimal*.iso" | head -1 )

2

A resposta davidgo não aborda a última parte. Deixe-me.

Seria possível passar o findresultado do comando para -exec dd {}e transferir o .isoarquivo dessa maneira?

Sim. Sua primeira abordagem pode ser:

find ~ -iname "*centos*minimal*.iso" -exec dd if={} of=/dev/sdb \;

no entanto, isso irá executar sequencialmente mais de um ddse houver mais de um arquivo correspondente. Com efeito, todos, exceto o último dd, serão uma perda de tempo. Para garantir findparadas após o primeiro dduso bem-sucedido -quit:

find ~ -iname "*centos*minimal*.iso" -exec dd if={} of=/dev/sdb \; -quit

Nota -quitnão é exigida pelo POSIX, o seu findpode ou não suportá-lo.


Obrigado Kamil por não fechar os olhos para a segunda parte, pois foi tão importante para mim quanto a primeira parte da pergunta.
Tomas.R
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.