EDIT: Embora a resposta original diga a você por que o comando find
não funcionou, o loop que usa find
não funcionará para HDDs USB. Role até o final da resposta para uma versão melhor.
Observe que o registro não funcionará com unidades flash USB; hdparm
é apenas para HDDs.
Seu comando find
não funcionará. Em absoluto. Por quê?
Existem alguns problemas, mas o principal deles é: A opção -exec
procura no PATH
para um executável com o nome do seu primeiro argumento e o executa com outros argumentos para find
até um ponto e vírgula. Ele não passa seus argumentos para um shell, o que significa usar $(...)
, redirecionamento, etc. não funcionará.
Como você conserta isso? Existem algumas maneiras.
O mais óbvio pode ser passar seu comando para um shell:
find . -name testing12345 -exec bash -c '...$(...)... > /path/to/some/file 2>&1' \;
Sim, isso funciona, mas em uma expressão complicada com vários tipos de citações, o escape pode rapidamente se tornar um pesadelo.
Geralmente, usar um loop é a maneira mais fácil de fazer isso. Como você já tem um comando find
em funcionamento, a maneira mais fácil de fazer isso é retirar os argumentos -exec
e enviá-los para um loop:
find (your find arguments here) -print0 | while IFS= read -r -d $'find /dev/ -name "sd?" -not -name "sda" -print0 | while IFS= read -r -d $'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
' 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
' filename; do
# process "$filename"
done
IFS=
e as opções -print0
e -d $'
para find
'read
e -r
evitam problemas com novas linhas em nomes de arquivos. A opção read
garante que echo
não processe as barras invertidas nos nomes dos arquivos.
Combinando isso e corrigindo seus outros problemas, nós conseguimos isso, o que parece funcionar:
find . -name testing12345 -exec bash -c '...$(...)... > /path/to/some/file 2>&1' \;
Eu mesmo testei com uma instrução shred
no lugar de find
, pois não quero destruir meus discos, então, por favor, diga-me se funciona.
EDIT: A versão lsblk
está corrompida para HDDs USB. Esta versão modificada que usa %code% funciona corretamente:
find (your find arguments here) -print0 | while IFS= read -r -d $'find /dev/ -name "sd?" -not -name "sda" -print0 | while IFS= read -r -d $'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
' 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
' filename; do
# process "$filename"
done