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.
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:
*
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:
\
peut rendre difficile la visualisation de ce qui est transmis par le shell à la commande find
."
implique parfois règles quelque peu compliquées .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.
-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
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.
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