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

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

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 &] \;

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

[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

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

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

Этот скрипт должен делать то, что вы хотите. Обратите внимание, что он должен работать от имени пользователя root!

#!/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 за предоставление этой улучшенной (и, надеюсь, теперь исправленной) версии.

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

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