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 ne trouve que les fichiers dont les noms sont exacts 2015
, sans autres caractères.
Votre deuxième commande, a find . -name *2015* -mtime +1 -exec ls -ltrh {} \;
peut-être échoué pour plusieurs raisons:
1. Les*
caractères non entre guillemets sont développés par le shell, puis transmis à find
.
S'il y a des fichiers directement contenus dans le répertoire courant (celui dans lequel vous vous trouvez lorsque vous avez exécuté cette find ...
commande) dont les noms contiennent 2015
(et ne commencent pas par un .
), le shell s'est développé *2015*
dans une liste de ces noms de fichiers, puis passé cette liste comme arguments find
. Ce n'est pas ce que vous voulez - au lieu de cela, vous voulez passer *2015*
littéralement comme un argument à rechercher, de sorte que find
, et non le shell, puisse trouver les fichiers qui lui correspondent.
Pour résoudre ce problème, citez *2015*
. Il existe trois façons courantes de procéder:
'*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 vous suggère de l'écrire avec des guillemets simples comme '*2015*'
, parce que:
Mais dans ce cas, cela n'a pas vraiment d'importance. '
et les "
deux traitent *
la même chose et l'expression n'est pas assez compliquée pour être \
citée, ce qui la rend difficile à comprendre.
2. -mtime +1
sélectionne uniquement les fichiers modifiés il y a deux jours ou plus .
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
arrondissez vers le bas : il s'agit d' une période de 24 heures. Mais -mtime +1
ne correspond qu'aux fichiers dont les délais de modification sont strictement supérieurs à une période de 24 heures. Ainsi, les fichiers d'hier ne correspondent pas.
Voir Pourquoi find -mtime +1 renvoie-t-il uniquement les fichiers de plus de 2 jours? pour plus d'informations, comme suggéré par steeldriver .
Pour rechercher les fichiers modifiés pour la dernière fois il y a plus de 24 heures , je suggère plutôt de le spécifier comme il y a 1440 minutes avec -mmin +1440
:
find . -name '*2015*' -mmin +1440 -exec ls -ltrh {} \;
Certains lecteurs se demandent peut-être pourquoi je n'ai pas cité {}
. Certaines personnes citent {}
pour rappeler aux humains que ce n'est pas une expression pour l' expansion de l'orthèse . Les coques de style Bourne (comme bash ) n'ont pas besoin {}
de rien à l'intérieur pour être citées. Peut-être que certains shell de style non Bourne 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 -exec
gérer correctement les noms de fichiers avec des espaces. C'est faux: avec {}
ou '{}'
, find
obtient les mêmes arguments, car le shell supprime les guillemets avant de passer '{}'
àfind
. Pour contrer cette idée fausse, je ne cite pas {}
, mais c'est une question de style - si vous préférez {}
documenter comment la coque ne traite pas {
et }
spécialement, c'est bien.
Je vous recommande également de modifier votre ls
commande, ou (comme Muru l'a suggéré ) de la remplacer par find
l' -ls
action de. ls -ltrh
ne fait probablement pas ce que vous envisagez car il est exécuté séparément pour chaque fichier trouvé et donc les indicateurs -t
et -r
, qui spécifient le tri, ne sont pas pertinents.
Bien que la sortie soit formatée un peu différemment qu'avec ls -l
, l'utilisation -ls
est plus simple et plus facile.
find . -name '*2015*' -mmin +1440 -ls
Ou si vous décidez que vous n'avez vraiment besoin que de répertorier les noms des fichiers (y compris leurs chemins d'accès, par rapport à .
), vous pouvez simplement spécifier aucune action, ce qui entraîne l'utilisation de l' -print
action par défaut :
find . -name '*2015*' -mmin +1440
find
partie me semble bien, mais j'ai également eu des problèmes avec le-exec
paramètre. Je n'ai pas pu faire fonctionner ça non plus. (J'essayais de déplacer tous les fichiers jpg d'un dossier vers son répertoire parent - et j'ai fini par le faire manuellement ...)