Как сохранить результат эха в переменную?

1450
Valter Silva

У меня есть этот вывод из s3cmd ls --list-md5команды.

 2013-05-22 12:20 1965154 41eae9b40d23de2f02bf07635870f6d0 s3://company-backup/company/amazon/ip-11-11-111-11/backup_server245/app.20121117040001.gz 2013-05-22 12:20 11456836 541b1bf78682f48867cc99dbb53c4c3a s3://company-backup/company/amazon/ip-11-11-111-11/backup_server245/app.20121118040001.gz .. 

Я пытаюсь проверить, md5sumсовпадает ли мой объект в корзине с моим md5sumна моей локальной машине. Для этого мне нужно получить hashрезультат в виде fourthстолбца и имя файла в виде fifthстолбца.

Как это:

41eae9b40d23de2f02bf07635870f6d0 s3://company-backup/company/amazon/ip-11-11-111-11/backup_server245/app.20121117040001.gz 

Но мне нужно только имя файла, поэтому для этого я использую basenameкоманду (я просто пока не знаю, как ее использовать, но выясню), в конце это выглядит так:

s3=`s3cmd ls --list-md5 s3://company-backup/company/amazon/ip-11-11-111-11/backup_server245/`; echo "$s3";  echo "$s3" | tr -s ' ' | cut -d ' ' -f 4; echo "$s3" | tr -s ' ' | cut -d ' ' -f 5; 

Теперь мне нужно сохранить результат из echo'sтой же переменной, как эти:

41eae9b40d23de2f02bf07635870f6d0 app.20121117040001.gz 

Таким образом, я мог сравнить результаты s3cmd ls --list-md5sumс моим md5sum *.gzбегом на месте.

update Используя подход diff, моя команда выглядит так:

ls --list-md5 s3://company-backup/company/amazon/ip-11-11-111-11/backup/server245/ \ | tr -s ' ' \ | cut -d ' ' -f 4,5 \ | sed 's= .*/= =' \ | diff -w - <(md5sum /backup/server245/*.gz) 

Дать следующий результат:

1,50c1,49 < d41d8cd98f00b204e9800998ecf8427e  < 41eae9b40d23de2f02bf07635870f6d0 app.20121117040001.gz < 541b1bf78682f48867cc99dbb53c4c3a app.20121118040001.gz .. --- > 41eae9b40d23de2f02bf07635870f6d0 /backup/diveo245/app.20121117040001.gz > 541b1bf78682f48867cc99dbb53c4c3a /backup/diveo245/app.20121118040001.gz .. 

Но как узнать файл, который отличается тогда? (потому что все равные я могу удалить alredy)

1
ты не можешь просто `Var = $ (echo ....)`? demure 11 лет назад 1

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

5
choroba

You need no variables. You can use diff to compare the outputs of two different commands:

s3cmd ls --list-md5 \ | tr -s ' ' \ | cut -d ' ' -f 5,6 \ | sed 's= .*/= =' \ | diff -w - <(md5sum *.gz) 

You might need to sort the outputs to have the files in the same order.

Или пропустите часть `diff`, запишите вывод в файл типа` s3.md5` и используйте `md5sum -c s3.md5` для проверки ваших локальных файлов. mpy 11 лет назад 2
Я просто не понимаю вывод diff и как с этим справиться. Я обновляю свой пост с выходом. Valter Silva 11 лет назад 0
@ValterHenrique: В вашем первоначальном вопросе вы использовали `md5sum * .gz`. Если вы включаете путь к аргументам `md5sum`, вы должны удалить его из его выходных данных или` cd / backup / server245 / *. Gz` и использовать предоставленную мной команду. choroba 11 лет назад 1
понял, спасибо за помощь, друг! Это действительно поможет мне. Valter Silva 11 лет назад 0
1
terdon

@choroba's answer is the way to go, but here is another way using variables as requested:

s3=`s3cmd ls --list-md5 \ s3://company-backup/company/amazon/ip-11-11-111-11/backup_server245/ | awk '' | awk -F"[/ ]" ''` echo $s3 41eae9b40d23de2f02bf07635870f6d0 app.20121117040001.gz 
+1 за трюк `awk -F ... $ NF`. mpy 11 лет назад 0

Похожие вопросы