L'utilisation du disque de fichiers dont les noms correspondent à une expression régulière, dans Linux?
Ainsi, dans de nombreuses situations, je voulais un moyen de savoir comment beaucoup de mon espace disque est utilisé par quoi, donc je sais à quoi s'en débarrasser, de les convertir dans un autre format, stocker ailleurs (comme les Dvd de données), de les déplacer vers une autre partition, etc. Dans ce cas, je suis à la recherche d'une partition Windows à partir d'un Linux SliTaz un support de démarrage.
Dans la plupart des cas, ce que je veux, c'est la taille des fichiers et des dossiers, et pour que j'utilise basé sur NCurses ncdu:
Mais dans ce cas, je veux un moyen d'obtenir la taille de tous les fichiers correspondant à regex. Un exemple regex pour .bak fichiers:
.*\.bak$
Comment puis-je obtenir de l'information, compte tenu d'un standard de Linux avec le noyau de GNU utilitaires ou BusyBox?
Edit: La sortie est prévu pour être parseable par un script.
Vous devez vous connecter pour publier un commentaire.
Je suggère quelque chose comme:
find . -regex '.*\.bak' -print0 | du --files0-from=- -ch | tail -1
Quelques remarques:
-print0
option pourfind
et--files0-from
pourdu
sont là pour éviter les problèmes avec les espaces dans les noms de fichier./dir1/subdir2/file.bak
, pas seulementfile.bak
, donc si vous de le modifier, d'en tenir compteh
drapeau du à produire un "lisible" format mais si vous voulez analyser les données en sortie, vous pourriez être mieux aveck
(toujours utiliser le kilo-octets)tail
de commande, vous devrez en plus de voir la taille des fichiers et des répertoiresSidenote: une belle interface outil pour trouver qui a mangé votre espace disque est FileLight. Il ne fait pas de regexes, mais est très pratique pour trouver des grands répertoires ou fichiers le colmatage de votre disque.
-s
pourdu
? Ne peut pas vérifier, mais je croisdu
pouvez afficher le total, sans la nécessité pourtail
. Que FileLight outil de rappel de Gnome Analyseur d'Utilisation des Disques. Pourtant, je trouve la "affichage des détails comme" de l'interface de la ncdu app je l'ai mentionné dans l'OP plus simple, mais la diversité est une bonne chose 🙂 (je l'ai déjà ouvert Analyseur d'Utilisation des Disques pour rendre quelqu'un pense que de celui de la nappe de l'INTERFACE utilisateur que ce que j'étais en train de fixer son PC était plus complexe que ce qu'il était réellement... Ça marche!!! Hehe).-s
affiche le total pour chaque argument séparément, ici, nous avons plusieurs arguments, donc-c
est l'option que nous avons besoin.du
, car il ne prend pas en charge--files0-from
, j'ai donc installé coreutils), donc je vais accepter celle-ci, comme il semble inmune terroristes les noms de fichiers.du
est mon préféré de réponse. Si vous avez un fixe de la structure du système de fichiers, vous pouvez utiliser:Si vous avez besoin d'ajouter des sous-dossiers, il suffit d'ajouter:
etc etc
Cependant, ce n'est pas une commande très utile, donc, à l'aide de votre trouver:
Que se fera l'écho de la taille totale, en octets de tous les fichiers que vous trouvez.
Espère que ça aide.
Exécuter ce dans un Bourne Shell pour déclarer une fonction qui calcule la somme des tailles de tous les fichiers correspondant à regex modèle dans le répertoire courant:
(Sinon, vous pouvez le mettre dans un script.)
Utilisation:
Le résultat sera un nombre (en Ko), y compris
0
(si il n'existe pas de fichiers correspondant à regex).Si vous ne voulez pas de regarder dans d'autres systèmes de fichiers (dites que vous voulez un look pour tous les
.so
fichiers sous/
, qui est un montage de/dev/sda1
, mais pas sous/home
, qui est un montage de/dev/sdb1
, ajouter un-xdev
paramètrefind
dans la fonction ci-dessus.IFS=$'\n'
pour des listes de lecture, donc, je suis juste habitué 😛 Mais dites vous queawk
peut tout faire - je viens de gratter des awk surface, donc si vous pouviez poster un moyen de le faire avec awk, et c'est moins hacky, je vais l'accepter 🙂 je voulais juste quelque chose qui a travaillé et m'a fallu un peu de temps pour rattraper cette fonction, j'ai donc pensé que je devais le partager. Il fonctionne de façon acceptable assez rapide pour moi en fait, mais si il ya une meilleure façon, je suis tout à fait pour. Si Ce n'était pas pour un script, ~1 min. disque dur pourrait être en effet trop lent.'\0'
. Lecture recommandée : mywiki.wooledge.org/ParsingLs (il s'agit dels
, mais ne vous laissez pas berner par elle : vous êtes dans le même piège)du -sk build/ bin/ | awk '{s+=$1} END { if (s ~ /[0-9]+/) { print s; } else print "0"; }'
. awk peut normalement faire le travail de coupe, mais votre cas de coupe n'est pas nécessaire de toute façon.sh
's en lecture n'accepte pas NUL délimiteurs.man read
me donne ceci. 🙁 Encore, je pourrais obtenir le standard des paquets GNU.Les solutions précédentes ne fonctionnent pas correctement pour moi (j'ai eu des ennuis de tuyauterie
du
), mais la suite a très bien fonctionné:La
iregex
option est une expression régulière insensible à la casse. Utilisationregex
si vous voulez qu'il soit sensible à la casse.Si vous n'êtes pas à l'aise avec les expressions régulières, vous pouvez utiliser le
iname
ouname
drapeaux (le premier étant pas sensible à la casse):Dans le cas où vous voulez que la taille de chaque match (plutôt que de simplement le total combiné), il suffit de laisser les canalisations de la queue de commande:
Ces approches éviter le sous-répertoire problème dans @MaddHackers réponse.
Espère que cela aide les autres dans la même situation (dans mon cas, trouver la taille de toutes les DLL dans un .NET solution).
+
signifiefind
vais essayer d'appeler ledu
commande aussi peu que possible, en ajoutant le plus de coups possible pour un seuldu
appel, cependant, en raison des limitations du système (par ex. max. pas de. de permis d'arguments), il peut ne pas être possible d'ajouter tous les coups à un seuldu
appel, puis il se divise, à travers de nombreux appels, ce qui va causer un résultat incorrect.*.bak
. Dans votre exemple, le shell de la développer, mais vous voulezfind
pour la développer, de sorte que vous devez utiliser"*.bak"
. Je vais corriger pour vous.Si vous êtes OK avec glob-modèles et vous êtes seulement intéressés dans le répertoire courant:
ou
La
%s
directive stat donne octets pas de kilo-octets.Si vous voulez descendre dans les sous-répertoires, avec bash, version 4, vous pouvez
shopt -s globstar
et utiliser le modèle**/*.bak
**/*.bak
moyens .bak fichiers sur n'importe quel sous-répertoire? c'est à dire, pas un seul répertoire ci-dessous?**/*.ext
était*/*.ext
.shopt -s globstar
? Essayezecho $BASH_VERSION
pour voir quelle est la version actuelle de votre shell. Cela fonctionne pour moi:mkdir -p a/b/c/d; touch a/b/c/d/file.txt; ls **/*txt
4.2.0(2)-release
. Après avoir faitshopt -s globstar
comme vous l'avez mentionné, il travaille dans de petites structures de dossier, mais si je l'ai essayer sur/
, l'utilisation du PROCESSEUR passe de 100%, et après une couple de minutes bash est tué. Je ne sais pas pourquoi, peut-être que c'est parce que c'est une VM sur 256 mo de RAM (bien, sur cette lumière distro il peut naviguer sur le web et avec qui), mais encore, semble trop peu fiable.find
, mais êtes-vous vraiment de l'exploration de votre totalité du système de fichiers pour les fichiers?/
, mais d'un autre, alors oui, j'en ai besoin pour ne pas mourir ou de fuite de mémoire si elle est utilisée dans la racine d'une partition. Comme une note de côté, j'ai toujours trouvéfind
TELLEMENT supérieur à Windows (non indexées) fonction de recherche... je ne comprends pas pourquoi Linux scanne un lecteur NTFS plus rapide que Windows. Et avec regexes, n'en est pas moins!La accepté de répondre suggère d'utiliser des
mais cela ne fonctionne pas sur mon système
du
ne sais pas--files-0-from
option sur mon système. Seulement GNUdu
sait que l'option, ce n'est ni une partie de la Norme POSIX (de sorte que vous ne trouverez pas dans FreeBSD ou macOS), ni que vous trouverez sur BusyBox basée sur les systèmes Linux (par exemple, la plupart des systèmes Linux embarqué) ou tout autre système Linux qui n'utilise pas la GNUdu
version.Puis, il y a une réponse, ce qui suggère d'utiliser:
Cette solution permettra de travailler aussi longtemps qu'il n'y a pas trop de fichiers trouvés, comme
+
signifie quefind
vais essayer d'appeldu
avec le plus de coups possible en un seul appel, cependant, il pourrait y avoir un nombre maximal d'arguments (N) un système prend en charge et s'il y a plus de hits que cette valeur,find
appelleradu
plusieurs fois, le fractionnement de la frappe en groupes plus petit que ou égal à N éléments et en ce cas, le résultat sera mauvais et de ne montrer de la taille de la dernièredu
appel.Enfin il n'y est une réponse à l'aide de
stat
etawk
, ce qui est une bonne façon de le faire, mais elle s'appuie sur la coquille d'expansion d'une façon que seul Bash 4.x ou versions ultérieures prennent en charge. Il ne fonctionnera pas avec les versions plus anciennes et si cela fonctionne avec d'autres shells est imprévisible.Une POSIX sont conformes solution (qui fonctionne sur Linux, macOS et toutes les variantes BSD), qui ne souffre d'aucune limitation et qui va sûrement travailler avec tous les shell serait: