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


16

J'ai donc obtenu un répertoire rempli d'autres répertoires et je me demandais s'il était possible de supprimer des fichiers sans taille. En règle générale, ces fichiers sont de 0 octet et comme je veux fusionner tous ces sous-répertoires, je pourrais remplacer un fichier parfaitement légitime par un fichier de 0 octet en apesanteur, et voilà mon fichier légitime. Est-il possible de supprimer les fichiers à zéro octet?

Réponses:


34

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

find . -type f -size 0b -print

remplacez -printpar -deletepour supprimer les fichiers plutôt que de les imprimer à l'écran.

find . -type f -size 0b -delete

Maintenant, existe-t-il un moyen de déplacer des fichiers d'un emplacement à un autre, et avec les conflits remplacer si la taille est la même mais conserver les deux copies si la taille est différente?
user245115

Cela ressemble à un travail pour rsync .

7
Vous pouvez utiliser à la -emptyplace de -size 0b.
Kevin

6

Recherchez et supprimez récursivement tous les fichiers d'une taille de 0:

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

4

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 a .). Bien que vous puissiez également le faire avec find, une alternative serait d'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 **correspondre un ou plusieurs sous-répertoires. **/*correspondra à tous les fichiers et répertoires du répertoire actuel et à tous ses sous-répertoires.
  • for file in **/*; do ...; done : parcourir 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" ](l' !inverse le test) est vrai si le fichier n'existe pas ou s'il est vide.
  • [ -f "$file" ]: vrai 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" : supprimer le fichier.

La &&veiller à ce que la commande suivante est exécutée uniquement si la précédente a réussi donc ce ne supprimer des fichiers vides, réguliers.


et j'ai pensé que ma réponse est compliquée :) +1
AB

2

Bien que la plupart des réponses ci-dessus soient correctes, jetez un œil à 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 jeter un œil à ces fichiers avant de les supprimer:

find . -type f -empty

Sur Ubuntu 14.04 LTS, sans le -type f, -emptysupprimera également les répertoires vides. Je viens de consulter la page de manuel.
Bulrush
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.