Si vous souhaitez faire une boucle sur des fichiers, n'utilisez jamaisls
*. tl; dr Il y a beaucoup de situations où vous finiriez par supprimer le mauvais fichier, ou même tous les fichiers.
Cela dit, malheureusement, c'est une chose délicate à faire correctement à Bash. Il y a une réponse de travail à une question en double, encore plus ancienne,find_date_sorted
que vous pouvez utiliser avec de petites modifications:
counter=0
while IFS= read -r -d '' -u 9
do
let ++counter
if [[ counter -gt 3 ]]
then
path="${REPLY#* }" # Remove the modification time
echo -e "$path" # Test
# rm -v -- "$path" # Uncomment when you're sure it works
fi
done 9< <(find . -mindepth 1 -type f -printf '%TY-%Tm-%TdT%TH:%TM:%TS %p\0' | sort -rz) # Find and sort by date, newest first
* Les gars sans infraction - je l'ai également utilisé ls
avant. Mais ce n'est vraiment pas sûr.
Edit: Nouveaufind_date_sorted
avec des tests unitaires.
((++counter>3))
comme test. C'est bien succinct. Quant aux oneliners: si la brièveté est un problème, enveloppez le code dans une fonction, alors ne vous inquiétez pas.Pour supprimer tous les fichiers, à l'exception des 3 plus récents, à l'aide d'un zsh glob, vous pouvez utiliser
Om
(majuscule O) pour trier les fichiers du plus ancien au plus récent et un indice pour récupérer les fichiers que vous souhaitez.Autres exemples:
la source
La méthode de loin la plus simple consiste à utiliser zsh et ses qualificatifs glob :
Om
pour trier par âge décroissant (c'est-à-dire le plus ancien en premier) et[1,3]
pour ne conserver que les trois premières correspondances.Voir aussi Comment filtrer un glob dans zsh pour plus d'exemples.
Et suivez les conseils de l0b0 : votre code se cassera horriblement si vous avez des noms de fichiers contenant des caractères spéciaux shell.
la source
Vous pouvez utiliser la fonction suivante pour obtenir le fichier le plus récent dans un répertoire:
Donnez-lui un ensemble de fichiers différent en supprimant le fichier le plus récent après chaque itération.
Conseil: Si vous conservez l'ensemble initial de fichiers dans un tableau appelé "$ {files [@]}", enregistrez l'index du fichier le plus récent trouvé et
unset 'files[index]'
avant l'itération suivante.Usage:
newest_in [set of files/directories]
Exemple de sortie:
la source
Tout d'abord, l'
-R
option est pour la récursivité, ce qui n'est probablement pas ce que vous voulez - qui recherchera également dans tous les sous-répertoires. Deuxièmement, l'<
opérateur (lorsqu'il n'est pas considéré comme une redirection) sert à la comparaison de chaînes. Tu veux probablement-lt
. Essayer:Mais j'utiliserais trouver ici:
la source
Je sais que c'est un péché à analyser
ls
, mais qu'en est-il:Un test rapide avec 5 fichiers vides:
la source
ls
sortie et utiliserfind
etxargs
ensemble de la mauvaise manière. Si vous combinezfind
etxargs
je vous recommande d'utiliser les optionsfind
s-print0
et en conséquencexargs
s-O
. Pour en savoir plus sur le sujet, lisez l'article Utilisation de la recherche . Vous voudrez peut-être également jeter un coup d'œil et découvrir pourquoi l' analyse ls est très mauvaise.Ce one-liner fait tout ce que je pense:
la source
Voici une solution:
la source