Как я могу уничтожить все диски, кроме /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 за предоставление этой улучшенной (и, надеюсь, теперь исправленной) версии.
Пожалуйста, скажите мне, работает ли это, я не очень мотивирован, чтобы проверить уничтожение моих собственных дисков...