Я пытаюсь сделать одну команду, которая возьмет все диски, которые не являются 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
Я получаю неоднозначную ошибку перенаправления.
Править: Хотя исходный ответ говорит Вам часть почему Ваш 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
Этот сценарий должен сделать то, что Вы хотите. Обратите внимание, что это должно работать как корень!
#!/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 для обеспечения это улучшилось (и надо надеяться теперь зафиксировал), версия.
скажите мне, работает ли это, я действительно не мотивирован для тестирования уничтожения моих собственных дисков...