Récupérer les fichiers modifiés récemment

Fermé
Murielle - 20 nov. 2022 à 23:00
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 - 26 nov. 2022 à 18:34

Bonjour,

Je viens de trouver une message de 2018 auquel Barnabe a donné une jolie solution. 
Je trouve cette commande très pratique (récupérer les  fichiers correspondant à dir /b /s
en conservant les dates.

for /f "delims=" %A in ('dir /b /s') do (echo %~ftA) 
(Merci Barnabe!) 

Est-il possible d'aller plus loin et de ne récupérer que les fichiers qui ont été modifiées (ou créés) dans les  dernières 24 heures (par exemple... ou les 7 derniers jours) 

Merci à tous ceux qui chercheront à répondre à ma demande.
Windows / Edge 107.0.1418.52

3 réponses

brucine Messages postés 18374 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 27 décembre 2024 2 726
21 nov. 2022 à 09:32

Bonjour,

La solution la plus simple dans un batch est rendue via ROBOCOPY en jouant sur le paramètre maxage (7 pour une semaine):
 

set "folder=MonDossier"

for /f "tokens=1,2,*" %%a in ('robocopy "%folder%" "%folder%" *.* /L /s /maxage:7 /nocopy /is /njh /njs /ndl /nc /ns /ts ^|sort ') do echo %%c
pause
1
brucine Messages postés 18374 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 27 décembre 2024 2 726
21 nov. 2022 à 10:25

Si pour une raison ou pour une autre je veux conserver l'horodatage dans le résultat, remplacer bien sûr %%c par %%~ftc qui rend aaaa/mm/jj hh:mn cheminfichier, si je ne veux pas le chemin %%~nxtc.

Supposons maintenant que je veuille le nom du fichier suivi de la date au format français jj-mm-aaaa:
 

set "folder=C:\Users\brucine\Desktop"

for /f "tokens=1,2,*" %%a in ('robocopy "%folder%" "%folder%" *.* /L /s /maxage:7 /nocopy /is /njh /njs /ndl /nc /ns /ts ^|sort ') do set name=%%~nxc & set time=%%a & call :process
pause

:process
set time=%time:~8,2%-%time:~5,2%-%time:~0,4%
echo %name% %time%



 

2
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 918
Modifié le 21 nov. 2022 à 20:59

Bonjour Murielle et brucine,

Moi je pencherais pour l'utilisation de la commande FORFILES :

FORFILES /S /C "cmd /c if @isdir==FALSE echo @path @fdate @ftime" /D +14/11/2022

-

Par contre je dois être idiot je ne comprends pas pourquoi la commande ne se comporte pas comme prévue lorsque j'utilise un nombre de jours au lieu d'une date fixe :

FORFILES /S /C "cmd /c if @isdir==FALSE echo @path @fdate @ftime" /D -7

Elle me sort tous les fichiers alors qu'ils sont plus anciens que 7 jours.

Est-ce que tu as le même problème chez toi brucine ?



1
brucine Messages postés 18374 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 27 décembre 2024 2 726
22 nov. 2022 à 07:18

Bonjour,

Oui, c'est le "bénéfice" de l'âge, j'en suis resté à Windows 2000 ou à peu près là où FORFILES n'est documenté qu'à partir de Windows 2008 R2.

La première syntaxe donne le résultat attendu mais a l'inconvénient de devoir spécifier la date sauf si elle peut faire l'objet d'une variable, ce que je ne crois pas.

La deuxième a un comportement "normal" puisque /D -n retourne tous les fichiers antérieurs à date du jour - n et non pas ceux depuis date du jour -n; si on veut utiliser FORFILES dans ce cadre, je n'ai pas testé, il faudrait probablement faire la différence:
exécuter FORFILES sans paramètre de date puis avec /D -n en sortant vers des fichiers temporaires puis retourner cette différence via une commande FINDSTR.

1

Cette solution est parfaite. 
Merci beaucoup Barnabe. 

Comme toi, le commutateur fonctionne avec un nombre de jour négatif (a été modifié depuis plus de 3 jours) mais pas avec un nombre positif (a été modifié dans les 3 derniers jours)

Par contre, comme je travaille dans une arborescences très grande qui contient 
c:\users\nom\dossier1\dossier2\...\dossier3\enfinlefichier
J'aimerais dans @Path supprimer tout le début c:\users\nom\dossier1\dossier2\...\

Comment faire pour que la chaine de caractère retournée avec @Path soit réduite  des 40 premiers caractères?

0
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 918 > Murielle
25 nov. 2022 à 21:55

Si tu veux récupérer uniquement le nom du fichier (avec l'extension), il faut remplacer @path par @file

Si tu veux récupérer le nom du fichier sans l'extension, il faut remplacer @path par @fname

0

Bonsoir Barnave,

Et non, je voudrais conserver uniquement  la fin du chemin car le chemin est tres long.

Mais si c'est trop compliqué, j'editerai le fichier texte en sortie et ferai un rechercher-remplacer!

0
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 918
Modifié le 26 nov. 2022 à 18:35

Ok dans ce cas pour supprimer les 40 premiers caractères il faut procéder ainsi :

setlocal enabledelayedexpansion

cd /d le dossier qui va bien

for /f "delims=" %%A in ('FORFILES /S /C "cmd /c if @isdir==FALSE echo @path @fdate @ftime" /D -7') do (
	set "fichier=%%A"
	set "fichier=!fichier:~40!"
	echo !fichier!
)
1