J'ai un répertoire avec beaucoup de fichiers 0 octets. Je ne peux même pas voir les fichiers lorsque j'utilise la commande ls. J'utilise un petit script pour supprimer ces fichiers, mais parfois, cela ne les supprime même pas. Voici le script:
i=100
while [ $i -le 999 ];do
rm -f file${i}*;
let i++;
done
Y a-t-il un autre moyen de faire cela plus rapidement?
Utilisez find
combiné avec xargs
.
find . -name 'file*' -size 0 -print0 | xargs -0 rm
Vous évitez de démarrer rm
pour chaque fichier.
Avec la find
de GNU (voir les commentaires), il n’est pas nécessaire d’utiliser xargs:
find -name 'file*' -size 0 -delete
Vous pouvez utiliser la commande suivante:
trouver . -maxdepth 1 -size 0c -exec rm {} \;
Et si vous souhaitez également supprimer les fichiers de 0 octet dans les sous-répertoires, omettez -maxdepth 1
dans la commande précédente et exécutez-le.
Supprimer tous les fichiers nommés fichier ... dans le répertoire actuel:
find . -name file* -maxdepth 1 -exec rm {} \;
Cela prendra encore beaucoup de temps car rm
est lancé pour chaque fichier.
find . -maxdepth 1 -type f -size 0 -delete
Ceci trouve les fichiers de taille 0 dans le répertoire actuel, sans entrer dans les sous-répertoires, et les supprime.
Pour lister les fichiers sans les supprimer:
find . -maxdepth 1 -type f -size 0
vous pouvez même utiliser l'option -delete qui supprimera le fichier.
de l'homme trouver, -effacer Supprimer les fichiers; vrai si la suppression a réussi.
Voici un exemple. Essayez par vous-même pour que cela ait un sens:
bash-2.05b$ touch empty1 empty2 empty3
bash-2.05b$ cat > fileWithData1
Data Here
bash-2.05b$ ls -l
total 0
-rw-rw-r-- 1 user group 0 Jul 1 12:51 empty1
-rw-rw-r-- 1 user group 0 Jul 1 12:51 empty2
-rw-rw-r-- 1 user group 0 Jul 1 12:51 empty3
-rw-rw-r-- 1 user group 10 Jul 1 12:51 fileWithData1
bash-2.05b$ find . -size 0 -exec rm {} \;
bash-2.05b$ ls -l
total 0
-rw-rw-r-- 1 user group 10 Jul 1 12:51 fileWithData1
Si vous consultez la page de manuel de find (tapez man find
), vous verrez un tableau d’options puissantes pour cette commande.
En montant un niveau, il est utile de comprendre pourquoi les fichiers sont là. Vous ne faites que traiter un symptôme en les supprimant. Que se passe-t-il si un programme les utilise pour verrouiller des ressources? Si tel est le cas, leur suppression pourrait conduire à la corruption.
lsof est un moyen de déterminer quels processus gèrent les fichiers vides.
Si vous souhaitez rechercher et supprimer tous les fichiers de 0 octet dans un dossier:
find /path/to/folder -size 0 -delete
"... parfois, cela ne supprime même pas ces fichiers" me fait penser que c'est quelque chose que vous faites régulièrement. Si tel est le cas, ce script Perl supprimera tous les fichiers normaux de zéro octet de votre répertoire actuel. Il évite complètement l'utilisation d'un appel système (unlink) et est assez rapide.
#!/usr/bin/env Perl
use warnings;
use strict;
my @files = glob "* .*";
for (@files) {
next unless -e and -f;
unlink if -z;
}