Как я могу уничтожить все диски, но/dev/sda и зарегистрировать вывод в файл?

Я пытаюсь сделать одну команду, которая возьмет все диски, которые не являются sda и выполненным клочком на них и выводят вывод к файлу журнала. До сих пор я имею

find /dev/ -name "sd?" -not -name "sda" -exec [shred -fvz {} > /home/ben/ProjectsInProgress/ShredLogs/$(hdparm -I {} | grep 'Serial\ Number' |cut -f2- -d:).log 2>&1 &] \;

Как Вы видите, я получил справедливое расстояние в это с поиском Google, но теперь я столкнулся с чем-то, что я не знаю, что сделать, потому что вывод, который я получил,

[1] 13097
{}: No such file or directory
]: command not found
[1]+  Exit 1                  find /dev/ -name "sd?" -not -name "sda" -exec [shred -fvz {} > /home/ben/ProjectsInProgress/ShredLogs/$(hdparm -I {} | grep 'Serial\ Number' |cut -f2- -d:).log 2>&1

У кого-либо есть предложение?

Кроме того, я в настоящее время работаю над этой проблемой, но предложения были бы хороши. Когда я работаю

shred -fvz /dev/sdb > /home/ben/ProjectsInProgress/ShredLogs/$(hdparm -I /dev/sdb | grep 'Serial\ Number' |cut -f2- -d:).log 2>&1

Я получаю неоднозначную ошибку перенаправления.

4
задан 15 September 2016 в 19:52

2 ответа

Править: Хотя исходный ответ говорит Вам часть почему Ваш find команда не работала, использование цикла find не будет работать на USB жесткие диски. Прокрутите к нижней части ответа для лучшей версии.

Обратите внимание, что вход не будет работать вообще с картами флэш-памяти с интерфейсом USB; hdparm только для жестких дисков.


Ваш find команда не будет работать. Вообще. Почему?

Существует несколько проблем, но главный - это: -exec опция заглядывает PATH для исполняемого файла с названием его первого аргумента и выполняет его с любыми другими аргументами find до точки с запятой. Это не передает свои аргументы оболочке, что означает использовать $(...), перенаправление, и т.д. не будет работать.

Как Вы фиксируете это? Существует несколько путей.

Самое очевидное могло бы быть должно передать Вашу команду оболочке:

find . -name testing12345 -exec bash -c '...$(...)... > /path/to/some/file 2>&1' \;

Да, это работает, но в сложном выражении с несколькими типами кавычек, выход может быстро стать кошмаром.

Часто, использование цикла является самым легким способом сделать это. Так как у Вас уже есть работа find команда, самый легкий способ сделать это должно взять -exec аргументы прочь его и канал он в цикл:

find (your find arguments here) -print0 | while IFS= read -r -d $'\0' filename; do
    # process "$filename"
done

IFS= и -print0 и -d $'\0' опции к find и read избегайте проблем с новыми строками в именах файлов. -r опция гарантирует это read не обрабатывает обратные косые черты в именах файлов.

Объединение этого и прикрепляет к Вашим другим проблемам, мы получаем это, которое, кажется, работает:

find /dev/ -name "sd?" -not -name "sda" -print0 | while IFS= read -r -d $'\0' filename; do
    if (hdparm -i "$filename" > /dev/null 2>&1); then
        shred -fvz "$filename" > /home/ben/ProjectsInProgress/ShredLogs/$(hdparm -i "$filename" | grep -o 'SerialNo=\S*' |cut -f2 -d=).log 2>&1 &
    fi
done

Я только протестировал его сам с echo оператор вместо shred так как я не хочу уничтожать свои диски, поэтому скажите мне, если это работает.


Править: find версия повреждается для USB жесткие диски. Эта измененная версия, которая использует lsblk работы правильно:

lsblk -ld | grep -o '^sd[b-z]' | while read -r filename; do
    filename="/dev/$filename"
    shred -fvz "$filename" > "/home/ben/ProjectsInProgress/ShredLogs/$(hdparm -I "$filename" | grep -o 'Serial Number:\s*\S*' | cut -f2 -d: | sed 's/^\s*//').log" 2>&1 &
done
2
ответ дан 1 December 2019 в 09:46

Этот сценарий должен сделать то, что Вы хотите. Обратите внимание, что это должно работать как корень!

#!/bin/bash
logpath="/home/ben/ProjectsInProgress/ShredLogs"
lsblk -l | grep -o '^sd[b-z] ' | while read f; do
    logfile="$logpath/$(hdparm -i "/dev/$f" | grep -oP "(?<=SerialNo=)\w+")"
    shred -fvz "$f" &> "$logfile"
done

Благодаря terdon для обеспечения это улучшилось (и надо надеяться теперь зафиксировал), версия.

скажите мне, работает ли это, я действительно не мотивирован для тестирования уничтожения моих собственных дисков...

2
ответ дан 1 December 2019 в 09:46

Другие вопросы по тегам:

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