web-dev-qa-db-fra.com

Supprimer les fichiers de 0 octet en taille via la ligne de commande?

J'ai donc rempli un répertoire avec d'autres répertoires et je me demandais s'il était possible de supprimer des fichiers sans taille. Généralement, ces fichiers ont une taille de 0 octet et, étant donné que je veux fusionner tous ces sous-répertoires, je pourrais remplacer un fichier parfaitement légitime par un fichier en apesanteur de 0 octet. Voilà mon fichier légitime. Un moyen de supprimer les fichiers de zéro octet?

16
user245115

Utilisez la commande Rechercher pour rechercher des fichiers par taille et imprimer les noms de fichier sur la sortie standard.

find . -type f -size 0b -print

remplacez -print par -delete pour supprimer les fichiers plutôt que de les imprimer à l'écran.

find . -type f -size 0b -delete
34
user257256

Recherchez et supprimez tous les fichiers dont la taille est 0 de manière récursive:

find . -type f -size 0 -print0 | xargs -I{} -0 rm {}

Exemple:

% ls -og   
total 4
-rw-rw-r-- 1 0 Jun  7 20:31 bar
-rw-rw-r-- 1 5 Jun  7 20:29 foo

% find . -size 0 -print0 | xargs -I{} -0 rm {}

% ls -og                                      
total 4
-rw-rw-r-- 1 5 Jun  7 20:29 foo
6
A.B.

Vous pouvez également le faire directement dans le shell. Cela peut être utile si vous ne souhaitez pas supprimer les fichiers cachés vides (ceux dont le nom commence par .). Vous pouvez également le faire avec find, mais une autre solution consisterait à utiliser le shell lui-même:

shopt -s globstar
for file in **/*; do [ ! -s "$file" ] && [ -f "$file" ] && rm "$file"; done

Explication

  • shopt -s globstar: active l'option globstar pour bash qui fait que ** correspond à un ou plusieurs sous-répertoires. **/* correspondra à tous les fichiers et répertoires du répertoire en cours et à tous ses sous-répertoires.
  • for file in **/*; do ...; done: itérer sur tous les fichiers et répertoires trouvés;
  • [ ! -s "$file" ]: [ -s "$file" ] est vrai si le fichier existe et n'est pas vide. Par conséquent, [ ! -s "$file" ] (le ! inverse le test) est vrai si le fichier n'existe pas ou s'il est vide.
  • [ -f "$file" ]: true si le fichier est un fichier normal. Pas un répertoire ou un fichier de périphérique ou un lien symbolique, etc.
  • rm "$file": supprime le fichier.

Le && veille à ce que la commande suivante ne soit exécutée que si la précédente a abouti, elle supprime uniquement les fichiers vides et normaux.

4
terdon

Bien que la plupart des réponses ci-dessus soient correctes, recherchez cette commande:

Un fichier de 0 octet signifie un fichier vide

bien que vous puissiez exécuter cette commande:

find . -type f -empty -delete

cela supprimera tous les fichiers vides.

Vous pouvez consulter ces fichiers avant de les supprimer:

find . -type f -empty
2
Maythux