web-dev-qa-db-fra.com

Comment lister les fichiers de plus d'une journée avec "2015" dans le nom du fichier?

Je souhaite répertorier tous les fichiers journaux n’appartenant pas à aujourd’hui et uniquement les fichiers dont le nom contient 2015.

Ce sont les commandes que j'ai essayées:

find . -name 2015 -mtime +1 -exec  ls -ltrh  {} \;
find . -name *2015* -mtime +1 -exec  ls -ltrh  {} \;

La sortie des deux n'est rien, mais les fichiers sont toujours là. Quelque chose ne va pas avec ces commandes, et je ne comprends pas quoi. Toute aide serait appréciée.

10
rɑːdʒɑ

La commande find . -name '*2015*' -mmin +1440 -ls fera probablement ce que vous voulez. Voir ci-dessous pour plus de détails.

Votre première commande avait -name 2015. Cela n'a pas fonctionné car il trouve niquement ​​les fichiers dont le nom est exactement ​​2015, sans autre caractère.

Votre deuxième commande, find . -name *2015* -mtime +1 -exec ls -ltrh {} \;, peut avoir échoué pour deux raisons:

1. Les caractères non codés * sont développés par le shell, then transmis à find.

S'il existe des fichiers directement dans le répertoire current ​​(celui dans lequel vous avez exécuté la commande find ...) dont les noms contiennent 2015 (et ne commencent pas par .), alors le - Shell a développé *2015* dans une liste de ces noms de fichiers, puis l'a transmise sous forme d'arguments à find. Ce n'est pas ce que vous voulez. Vous voulez plutôt passer *2015* littéralement en tant qu'argument à rechercher, afin que find, et non le shell, puisse trouver les fichiers qui lui correspondent.

Pour résoudre ce problème, citez *2015*. Il y a trois façons courantes de le faire:

  • '*2015*' (c.-à-d. find . -name '*2015*' -mtime +1 -exec ls -ltrh {} \;)
  • "*2015*" (c.-à-d. find . -name "*2015*" -mtime +1 -exec ls -ltrh {} \;)
  • \*2015\* (c.-à-d. find . -name \*2015\* -mtime +1 -exec ls -ltrh {} \;)

Je suggère l'écrit avec des guillemets simples comme '*2015*', parce que:

Mais dans ce cas, cela n'a pas vraiment d'importance. ' et " traitent tous deux * de la même manière et l'expression n'est pas assez compliquée pour que \ citant soit difficile à comprendre.

2. -mtime +1 sélectionne uniquement les fichiers modifiés deux ou plus jours auparavant.

Comme man find dit:

       Numeric arguments can be specified as

       +n     for greater than n,

       -n     for less than n,

       n      for exactly n.
       -mtime n
              File's data was last modified n*24 hours ago.  See the  comments
              for -atime to understand how rounding affects the interpretation
              of file modification times.
       -atime n
              File was last accessed n*24 hours ago.  When  find  figures  out
              how  many  24-hour  periods  ago the file was last accessed, any
              fractional part is ignored, so to match -atime +1, a file has to
              have been accessed at least two days ago.

Supposons qu'un fichier a été modifié il y a 47 heures. Pour déterminer le nombre de périodes de 24 heures, find tours bas: c'est n il y a une période de 24 heures. Mais -mtime +1 ne correspond qu'aux fichiers dont les temps de modification sont strictement supérieurs à il y a une période de 24 heures. Ainsi, les fichiers d'hier ne sont pas appariés.

Voir Pourquoi find -mtime +1 ne retourne-t-il que les fichiers de plus de 2 jours? pour plus d'informations, comme suggéré par steeldriver .

Pour trouver les fichiers modifiés pour la dernière fois il y a plus de 24 heures , je suggère plutôt de spécifier il y a 1440 minutes avec -mmin +1440:

find . -name '*2015*' -mmin +1440 -exec ls -ltrh {} \;

Certains lecteurs pourraient se demander pourquoi je n'ai pas cité {}. Certaines personnes citent {} pour rappeler aux humains qu'il ne s'agit pas d'une expression pour expansion du corset . Coques style Bourne (comme bash ) ne pas == nécessite {} avec rien à l'intérieur d'être cité. Peut-être que certains Shell non-Bourne-style le traitent spécialement; c'est peut-être pourquoi certains utilisateurs le citent. Mais il y a aussi une idée fausse selon laquelle il faut parfois citer {} pour que -exec gère correctement les noms de fichiers avec des espaces. C'est faux: avec {} ou '{}', find obtient les arguments mêmes, comme le shell supprime les guillemets avant de passer de '{}' à find. Pour contrer cette idée fausse, je ne cite pas {}, mais c’est une question de style. Si vous préférez que {} documente le fait que le shell ne traite pas spécialement { et }, c’est très bien.

Je vous recommande également soit de changer votre commande ls , ou (comme muru a suggéré ) de la remplacer par l'action find's -ls. ls -ltrh ne fait probablement pas ce que vous souhaitez car il est exécuté séparément pour chaque fichier trouvé et, par conséquent, les indicateurs -t et -r, qui spécifient le tri, ne sont pas pertinents.

Bien que le format de la sortie soit un peu différent de celui de ls -l, l’utilisation de -ls est plus simple et plus facile.

find . -name '*2015*' -mmin +1440 -ls

Ou, si vous décidez que vous devez uniquement répertorier les noms du fichier (y compris leurs chemins, par rapport à .), vous pouvez simplement ne spécifier aucune action, ce qui entraîne l'utilisation de l'action -print par défaut:

find . -name '*2015*' -mmin +1440
18
Eliah Kagan

Dans zsh , vous pouvez utiliser qualificatifs globaux (il s'agit d'une fonctionnalité zsh unique, non disponible dans d'autres shells tels que bash).

ls -ltr *2015*(m+1)

Cela ne répertorie que les fichiers du répertoire en cours; pour traverser les répertoires de manière récursive , utilisez

ls -ltr **/*2015*(m+1)

Avec find, -name 2015 ne trouve que les fichiers dont le nom est exactement 2015. -name *2015* ne fonctionne que s'il n'y a pas de fichiers dont le nom contient 2015 dans le répertoire en cours, car le shell développe le modèle *2015* avant que find soit appelé. Vous devez citer le motif:

find -name '*2015*' -mtime +1 …

Notez que find -mtime +1 et *(m+1) de zsh recherchent des fichiers datant d’au moins 48 heures et non de fichiers plus anciens qu’aujourd’hui. Le signe plus signifie "strictement plus que" et le nombre de jours est arrondi. Pour rechercher des fichiers datant d’au moins 24 heures, utilisez -mtime +0 ou (m+0).

Si vous souhaitez rechercher les fichiers qui ont été modifiés pour la dernière fois hier ou avant , vous pouvez utiliser find avec le prédicat -newermt :

find -name '*2015*' ! -newermt 'today 0:00' …

Il n'y a pas vraiment de moyen pratique de faire ce test en zsh.

2
Gilles

Citez l’expression et je vous suggère de citer également les crochets.

find . -name "2015" -mtime +1 -exec  ls -ltrh  '{}' \;

ou

find . -name "*2015*" -mtime +1 -exec  ls -ltrh  '{}' \;

vous n'avez pas besoin de transmettre les fichiers que vous trouvez à ls

find . -name "*2015*" -mtime +1
2
Panther