web-dev-qa-db-fra.com

trouver un fichier avec "find" et afficher la taille du fichier

Comment puis-je trouver un fichier en même temps voir sa taille? ERREUR: J'ai essayé cette commande, mais je n'ai eu que la taille et les détails des autres fichiers.

find -name "*.conf" | ls -l
5
user831837

find a une option -ls. Donc, votre commande devrait ressembler à ceci:

find -name '*.conf' -ls
12
Lienhart Woitok

Une option consiste à spécifier votre propre format avec -printf. Par exemple, ceci affichera la taille du fichier suivi d'un espace, puis le nom du fichier (avec le chemin relatif):

find -name "*.conf" -printf "%s %p\n"

Vous pouvez terminer votre chaîne de format avec \0 au lieu de \n si vous souhaitez séparer les enregistrements de sortie de NUL, dans le cas où vous attendez des noms de fichiers amusants (par exemple, ceux incluant des nouvelles lignes).


Pour mémoire, la tentative indiquée dans votre question ne fonctionne pas car vous essayez de canaliser la sortie de find vers l'entrée dans ls. ls ne lit aucune entrée de STDIN. Par conséquent, la sortie de find est simplement ignorée, puis ls répertorie le contenu du répertoire actuel, comme d'habitude.

7
Digital Trauma

D'autres réponses ont déjà souligné

  1. comment imprimer la taille du fichier avec find uniquement, en utilisant _-printf_
  2. comment obtenir une sortie ls avec find uniquement, en utilisant _-ls_
  3. comment diriger correctement la sortie de find vers un autre programme avec xargs

Cependant, la première et la deuxième approche ne donnent pas la sortie exacte de _ls -l_ (le drapeau _-ls_ est égal à _ls -dils_) et la troisième nécessite un appel supplémentaire xargs. Avec l’aide du drapeau _-exec_, il est possible d’appeler _ls -l_ directement à partir de find:

_find -name "*.conf" -exec ls -l {} +
_

Cela donne la liste complète des noms de fichiers sous forme d'arguments à _ls -l_ et l'appelle autant de fois que nécessaire.


Si vous voulez juste faire correspondre tous les fichiers se terminant par _.conf_ dans et sous le répertoire en cours (et ARG_MAX n'est pas un problème!), vous n'avez pas besoin de find du tout . Vous pouvez plutôt utiliser les correspondances globales de bash avec les options de shell globstar et dotglob comme suit: il est tout aussi sage de ne pas interrompre les nouvelles lignes dans les noms de fichiers et de faire correspondre les fichiers "masqués" comme find:

_$ shopt -s globstar dotglob
$ ls -l **/*.conf
_
4
dessert

ls ne récupère pas sa liste de fichiers à partir d'une entrée standard, il s'attend à ce qu'ils soient des arguments. La commande xargs est une fonctionnalité générale permettant de transformer une entrée en arguments:

find -name '*.conf' | xargs ls -l

Toutefois, cela divisera les entrées en blancs, vous pouvez donc avoir des problèmes si l'un des noms contient des espaces. find et xargs ont des options qui fonctionnent ensemble pour atténuer cela:

find -name '*.conf' -print0 | xargs -0 ls -l

L'option -0 sur xargs lui dit d'utiliser un octet nul comme séparateur entre les paramètres de l'entrée et -print0 indique à find d'imprimer les noms séparés par un octet nul. au lieu de nouvelle ligne.

3
Barmar