KEYWORDS=("dolphins" "fish" "dogs" "cats" "iguanas")
IFS=$'\n'
find . -type f ! -exec grep -qF "${KEYWORDS[*]}" {} \; -exec rm -f {} \;
Excluiria os arquivos que não possuem nenhuma das palavras-chave.
KEYWORDS=("dolphins" "fish" "dogs" "cats" "iguanas")
IFS=$'\n'
find . -type f -size +1c ! -exec grep -qF "${KEYWORDS[*]}" {} \; -exec truncate -s 0 -f {} \;
Se um arquivo tiver mais de 1 byte, pesquise palavras-chave. Se a palavra-chave não for encontrada, truncá-la para 0 bytes. Eu recebo o seguinte erro:
truncate: invalid option -- 'f'
Try 'truncate --help' for more information.
KEYWORDS=("dolphins" "fish" "dogs" "cats" "iguanas")
IFS=$'\n'
find . -type f ! -exec grep -qF "${KEYWORDS[*]}" {} \; -exec rm -f {} \;
Excluiria os arquivos que não possuem nenhuma das palavras-chave.
Ao usar expressões regulares estendidas ou Perl, grep
pode ter vários padrões de pesquisa separados por um canal ( |
):
-E, --extended-regexp
Interpret PATTERN as an extended regular expression (ERE, see
below). (-E is specified by POSIX.)
-P, --perl-regexp
Interpret PATTERN as a Perl regular expression (PCRE, see
below). This is highly experimental and grep -P may warn of
unimplemented features.
Isso significa que você não precisa declarar um array para seus kewords, basta combiná-los em uma única string, separados por |
. Isso facilita muito seu script:
#!/usr/bin/env bash
wget --no-clobber -r -E -e robots=off -U mozilla -R gif,jpeg,tif,jpg,pdf,bmp,png,css,js http://www.url.com
KEYWORDS='dolphins|fish|dogs|cats|iguanas'
for file in **; do
if [[ -r "$file" ]] && [[ -f file ]] ! grep -wqP "$KEYWORDS" "$file"; then
rm -f "$file"
fi
done
Para encontrar arquivos que não contenham um padrão específico, você pode usar:
if ! grep -q $pattern "$file"; then
# The file does not have a match
do_stuff_to "$file"
else
# There is a match
do_something_else_to "$file"
fi
Então, para usar suas palavras-chave de exemplo, depois do seu wget
, você pode usar:
declare -a KEYWORDS
KEYWORDS=("dolphins" "fish" "dogs" "cats" "iguanas")
for keyword in ${KEYWORDS[@]}; do
for file in **; do
if [[ -r "$file" ]] && ! grep -q $keyword "$file"; do
rm -f "$file"
fi
done
Você está ansioso para excluir um arquivo que não contém sequer uma única palavra-chave? (Em outras palavras, reter os arquivos que contêm pelo menos uma palavra-chave?) A seguir apresenta uma solução compacta usando o GNU grep
:
rm $(find . -type f -exec grep -LwE 'keyword1|keyword2|keyword3' {} +)
Acima, find . -type f -exec grep -LwE 'keyword1|keyword2|keyword3' {} +
lista o nome de todo o arquivo que não contém nenhuma palavra-chave. Aqui, três argumentos são usados com grep
:
w
indica que uma palavra inteira deve ser correspondida (por exemplo, grep -w get file_name
indica que a palavra inteira "get" deve ser correspondida no arquivo e não dizer "esquecer"). E
informa grep
para corresponder a vários padrões. Nesse caso, suas palavras-chave são os padrões. L
imprime os nomes dos arquivos que não correspondem a nenhum padrão. Para citar as man
pages: -L, --files-without-match Suppress normal output; instead print the name of each input file from which no output would normally have been printed. The scanning will stop on the first match.
Portanto, quando find
retornar uma lista de nomes de arquivos, você poderá excluí-los usando rm
.
Como você sabe, rm
excluirá os arquivos. Portanto, tenha cuidado ao executar o comando acima. No começo, você pode simplesmente executar o comando find
e verificar manualmente se ele funciona conforme sua necessidade.