Existe uma maneira de excluir todos os arquivos menores que x

0

É possível em um único comando excluir todos os arquivos que correspondem a um padrão.

file_name_1294132_rest_of_file

rm \*(less than 1294132)\*
    
por matthewdaniel 11.12.2013 / 23:31

3 respostas

2

No caso mais simples em que você tem nomes de arquivos que não contêm caracteres estranhos, como novas linhas, você pode fazer:

rm "$(ls | gawk -F_ '$3<1294132')"

Existem várias razões para evitar a análise de ls , então aqui está uma maneira de contornar isso:

for f in file_*; do 
   printf %s "$f" | perl -anF_ -e 'unlink() if $F[2]<1294132'; 
done
    
por 12.12.2013 / 05:38
1

Eu assumo o UNIX / Linux por causa do comando "rm".

Todos os arquivos estão no mesmo diretório? Se não, isso complica muito as coisas.

Se estiverem, você provavelmente tem um problema com muitos arquivos em um diretório e deve pensar no seu layout.

Isso funcionará, mas será lento:

seq 1 1294131 | xargs -i{} echo rm file_name_{}_rest_of_file

(claro, tire o eco quando quiser executar o verdadeiro rm) Para acelerar as coisas, eu faria globs nos arquivos que não precisam de comparação:

rm file_name_[1-9]_rest_of_file
rm file_name_[1-9][0-9]_rest_of_file
rm file_name_[1-9][0-9][0-9]_rest_of_file
rm file_name_[1-9][0-9][0-9][0-9]_rest_of_file

até que sua shell reclame sobre o tamanho da linha de comando.

Outra rápida e suja seria:

find . -name 'file_name_*_rest_of_file' | sort -n > /tmp/files.txt

edite file.txt para remover arquivos que devem não ser excluídos

< /tmp/files/txt xargs rm

Você também pode escrever um script que tokenize o nome do arquivo em componentes, extraia a "contagem", faça uma comparação e, em seguida, exclua ou transmita o arquivo. Mas isso provavelmente levaria mais tempo do que o acima.

    
por 11.12.2013 / 23:38
1

Você poderia colocar tudo isso em uma linha (com ';' s) e chamá-lo de um comando

for f in file_name_*_rest_of_file
do 
   n=${f//[^0-9]}
  if [[ -n $n && $n -lt 22 ]]
  then
    echo del $f
  fi
done

É um pouco longo

for f in file_name_*_rest_of_file;do; n=${f//[^0-9]}; if [[ -n $n && $n -lt 22 ]]; then echo del $f; fi;done

$ {f // [^ 0-9]} é um bashismo e pode ser feito com

nn=${f#file_name_}
n=${nn%_rest_of_file}

ou

n='echo $f | tr -C -d '[0-9]''
    
por 12.12.2013 / 00:37