Как передать переменную результата команды find в dd

199
Tomas.R

Я пытаюсь передать файл CentOS.iso на флэш-накопитель USB с помощью ddкоманды, передав переменную, которая является результатом команды find.

Я хочу передать переменную, как это

dd if=$isofile of=/dev/sdb 

Сначала мне нужно создать правильную переменную, вот как я это делаю

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

Однако вывод выполнения созданной переменной

$isofile 

не выглядит многообещающе Я не могу передать это dd if=команде.

terminal window

Можно ли этого достичь? Передать переменную в if=?

На той же ноте, возможно ли передать результат findкоманды -exec dd {}и передать .isoфайл таким образом?

0
Незначительная вещь - предполагая, что ваша команда isofile = сработала, вы должны просматривать ее содержимое с помощью «echo $ isofile», а не $ isofile - последний попытается запустить содержимое $ isofile, а не отображать переменную. davidgo 5 лет назад 0
После определения переменной с неправильными галочками, запуск ее был полу-правильным, чтобы достичь * чего-то *. Файл не найден, потому что `find -iname` получил аргумент с буквальными двойными кавычками. В случае команды, выполняемой «вручную», оболочка использовала эти кавычки, чтобы узнать, что делать (а что не делать) со строкой внутри, а затем передавала строку в `find` без них. Kamil Maciorowski 5 лет назад 0
Примечание: лучше использовать `dd if =" $ isofile "…` (цитируя!). Пробел в имени файла не нарушит команду. Kamil Maciorowski 5 лет назад 0
Да, Камил, двойные кавычки для переменных, вы не увидите, чтобы я снова делал эту ошибку. Tomas.R 5 лет назад 0

2 ответа на вопрос

2
davidgo

Вы используете неправильную команду escape. Команда, которую вы вводите с использованием одного символа enquote, в основном определяет всю строку поиска как строку букв. (Вы можете увидеть это, набрав echo $ isofile). Что вы хотите сделать, это выполнить это, а затем сделать вывод в переменную. Есть как минимум 2 способа сделать это -

То, как вы, вероятно, намеревались - то есть использовать обратные тики вместо прямых тиков, т.е.

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

или похожая, более современная версия

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

Оба из вышеупомянутых имеют проблему того, что, если есть больше чем 1 соответствие файла. Вы можете исправить это, выполнив что-то вроде ниже, чтобы взять первую строку.

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

Ответ Давидго не относится к последней части. Разрешите.

Можно ли передать результат findкоманды -exec dd {}и передать .isoфайл таким образом?

Да. Ваш первый подход может быть:

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

однако это будет последовательно выполнять более одного, ddесли существует более одного соответствующего файла. Фактически все, кроме последнего, ddбудет пустой тратой времени. Чтобы обеспечить findостановки после первого успешного ddиспользования -quit:

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

Примечание -quitне требуется POSIX, вы findможете или не можете его поддерживать.

Спасибо, Камил, за то, что вы не закрыли глаза на вторую часть, поскольку это было так же важно для меня, как и первая часть вопроса. Tomas.R 5 лет назад 0