J'ai besoin de déplacer des fichiers en fonction d'un an. J'ai utilisé la find
commande
find /media/WD/backup/osool/olddata/ -mtime +470 -exec ls -lrth {} \;|sort -k6
mais pour que cette commande s'exécute avec succès, je dois connaître l'exact mtime
maintenant 470 n'est qu'une supposition. Signifie que si je peux donner l'année 2012, cela me donne des fichiers uniquement liés à 2012.
J'ai donc besoin de conseils pour
Recherchez les fichiers en fonction de l'année, par exemple 2012 et déplacez-les vers un autre répertoire.
OS release 5.2
FIND version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX
-exec ls ... \;
place de-exec ... +
? Votre trouvaille est-elle trop vieille pour ça? Dans ce cas, cefind ... -print0 | xargs -0 ls...
serait beaucoup plus rapide.Réponses:
Vous souhaitez utiliser l'
-newermt
option pourfind
:pour obtenir tous les fichiers avec un temps de modification en 2012.
Si votre recherche ne prend pas en charge,
-newermt
vous pouvez également effectuer les opérations suivantes pour éviter d'utiliser des calculs de décalage:la source
find
(j'ai trouvé la version 4.4.2)-exec ls
n'a aucun sens.la source
-exec ls -l
est plus logique et encore plus lors des tests.find
peut imprimer tout ce quils
peut. OK, à une exception près: échapper / citer des caractères désagréables. Mais en général, la sortie defind
peut être triée directement. Les appels inutiles de ls n'accélèrent pas le tout.-print
ou peut - être-ls
) lors des tests. L'avantage d'utiliser-exec ls {}
est qu'il exécute déjà quelque chose d'extérieur à trouver . Donc, au moment où vous passez dels
àmv
, les changements réels sont minimes.Selon la page de manuel, l'argument de -mtime est le nombre de jours que vous recherchez. Vous pouvez utiliser
date +%j
pour trouver le nombre de jours depuis le 1er janvier de l'année en cours.la source
-daystart
option que si vous allez travailler avec-mtime
. Sinon, vous aurez des problèmes avec les fichiers au début et à la fin de l'année, quelle que soit la façon dont vous tournez, sauf si vous l'exécutez exactement à minuit. Vous pouvez effectuer le décalage avec plus de précision qu'avec-mmin
qu'avec-mtime
si vous pouvez facilement trouver le nombre de minutes depuis la nouvelle année. Mais le même problème existe avec cela qu'avec-mtime
, juste pour moins de fichiers (ceux d'une minute vers minuit).find -mtime $("date -+%j")
ne donnera probablement pas au PO ce qu'il cherche. Je laisse cela à la postérité, car cela semble être un angle mort possible pour les gens.Vous pouvez essayer d'utiliser une combinaison avec les commandes
stat
et / oudate
comme dans les lignes simples suivantes:BSD / Mac OS X:
Linux:
Dans les deux cas, l'approche consiste à utiliser la
date
commande pour extraire l'année de la dernière heure de modification de chaque fichier, puis à construire un chemin avec cette année. La commandemkdir -p
créera ce chemin s'il n'existe pas déjà. Bien sûr, vous pouvez utiliser d'autresfind
options pour affiner votre recherche.la source
Si vous le faites à partir du répertoire de travail, vous pouvez le faire à la place:
Cela simplifie considérablement les choses et ne provoque aucun chevauchement. Mais cela suppose également que ces fichiers ont plus de 6 mois, et cela
ls
imprimera l'année au lieu de l'heure exacte.Pour les fichiers de moins de 6 mois, il vous suffira de le remplacer par ceci:
ou quelque chose de similaire, selon le mois. Si vous souhaitez créer une liste de mois pour déplacer des fichiers (ou si vous souhaitez créer une liste pour des années), procédez comme suit:
la source