Encontre a saída do comando para classificar e, em seguida, excluir

2

Eu quero encontrar alguns arquivos baseados em algum padrão em seus caminhos e, em seguida, quero manter apenas os 3 arquivos mais recentes desse padrão e os outros que eu quero excluir.

    
por user5783725 18.05.2018 / 12:50

2 respostas

3

com zsh :

echo rm -f ./**/*pattern*(.Dom[4,-1])
  • **/ de qualquer nível de subdiretórios
  • Qualificadores (...) glob para qualificar a correspondência com outros critérios:
  • . : apenas arquivos regulares
  • D : inclua arquivos de pontos (arquivos ocultos) e procure diretórios ocultos
  • om : ordem por hora da modificação (da mais recente para a mais antiga)
  • [4,-1] : de 4 th para último (então, pula os 3 primeiros).

(remova echo para fazer isso)

Para um equivalente usando qualquer shell POSIX e utilitários GNU:

(export LC_ALL=C
find . -name '*pattern*' -type f -printf '%T@/%p
(export LC_ALL=C
find . -name '*pattern*' -type f -printf '%T@/%p
echo rm -f ./**/*pattern*(.Dom[4,-1])
' | tr '\n
(export LC_ALL=C
find . -name '*pattern*' -type f -printf '%T@/%p
(export LC_ALL=C
find . -name '*pattern*' -type f -printf '%T@/%p%pre%' |
  tr '\n%pre%' '%pre%\n' |
  sort -rn |
  tail -n +4 |
  cut -d/ -f2- |
  tr '\n%pre%' '%pre%\n' |
  xargs -r0 echo rm -f)
' | sort -zrn | tail -zn +4 | cut -zd/ -f2- | xargs -r0 echo rm -f)
' '%pre%\n' | sort -rn | tail -n +4 | cut -d/ -f2- | tr '\n%pre%' '%pre%\n' | xargs -r0 echo rm -f)
' | sort -zrn | tail -zn +4 | cut -zd/ -f2- | xargs -r0 echo rm -f)

(remova echo para fazer isso)

Com versões mais antigas dos utilitários GNU, você pode precisar de:

%pre%     
por 18.05.2018 / 13:44
-1

bem, a classificação requer uma lógica em torno disso, mas até agora:

# Create an array with the files you want to target
FILES=$(find ${PATH_TO_FOLDER} -type f -name "whatever.whatever")
# Get the total size of the array 
totalSize=${#FILES[@]}
# Detract 3 from total size to create a threshold
stopat=((${totalSize}-3))
# Declare a counter at 0
counter=0
# iterate file by file in the array
for FILE in "${FILES[@]}"
do
   # make sure that you do this until 3 files are left
   while [ ${counter} -le ${stopat} ]
   do
      rm -v ${FILE}
      ((counter++))
   done
done

ao usar -name , você pode usar expressões estendidas, por exemplo, *.sh ou hello*.sh ou *hello.sh etc.

Por favor, note que o comando acima irá deletar todos os arquivos, mas 3, use o comando sort para ordenar os arquivos conforme desejado (usando tamanho, data de criação ou modificação) aqui:

FILES=$(find ${PATH_TO_FOLDER} -type f -name "whatever.whatever")

    
por 18.05.2018 / 13:21