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?

user245115
la source

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

la source
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
UN B
la source
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.

terdon
la source
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
Maythux
la source
Sur Ubuntu 14.04 LTS, sans le -type f, -emptysupprimera également les répertoires vides. Je viens de consulter la page de manuel.
Bulrush