Um par de ponteiros:
-
Você está planejando apenas digitalizar / home para encontrar todos os diretórios home. Provavelmente está bem além da classe Intro to Linux, mas isso não funciona em configurações mais complicadas.
getent passwd
pode ser um pouco melhor, mas de novo certamente além do Linux I. -
Não estou completamente claro se você está procurando palavras impróprias no arquivo nomes ou no conteúdo . Se os nomes,
find
é uma maneira fácil de pesquisar nomes de arquivos (find PATHS '(' -iname '*badword1*' -or -iname '*badword2*' -or … ')' -print
) -
Se você está procurando no conteúdo,
grep
é de fato o caminho a percorrer. Você provavelmente vai querer que-H
faça sempre que o nome do arquivo seja impresso.-n
(número da linha de impressão, contando a partir de 1) ou-b
(offset de byte de impressão) também pode ser útil. Como alternativa,-l
fornecerá apenas os nomes de arquivos correspondentes. (Além disso, nem todos os arquivos são texto puro; os resultados podem ser estranhos em arquivos binários). -
O comando shell para ler de um arquivo é
read
. Como você planeja solicitar ao usuário durante o loop, você terá que ler em algum lugar diferente de stdin (passando-u
). Normalmente, você o usaria em um loopwhile
. Além disso, observe que o redirecionamento vem após o comando - nesse caso, o comando é todo o loop!while read -r -u 5 WORD1 WORD2; do true # do something with $WORD1 and $WORD2 here done 5<filename.txt
-
A divisão do Word é feita por
read
com base em$IFS
, como quase todos os comandos do shell. Então, se você definir como','
, ele será dividido com base em vírgulas. Se você definir como':'
, isso pode ser útil ☺. -
Você pode separar caminhos usando uma variedade de métodos.
cut
pode fazer isso,basename
edirname
obtêm peças específicas. Osed
e oawk
também podem fazê-lo, mas são provavelmente excessivos. Se você estiver usando o Bash, sua expansão estendida é a maneira mais fácil (e rápida). Está na página man em "Parameter Expansion". Por exemplo:$ foo='/home/bob' $ echo "${foo#/home/}" bob
Atualização:
-
Em vez de remover uma linha específica, sugiro que você apenas escreva um novo arquivo com todas as linhas que o usuário disse que não são aceitáveis. Você pode usar algo como
sed
para excluir uma linha de um arquivo, mas (nos bastidores) está realmente escrevendo um novo arquivo sem a linha. De modo geral, os sistemas de arquivos não permitem encurtar um arquivo, exceto no final. -
O prompt é bastante fácil,
read
tem uma opção para isso. Mas você vai obter um resultado surpreendente, já que você deixou de fora todas as coisas5
que eu tinha no meu exemplo. -
Confira
set -x
para depuração.