Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/01/2014, à 03:27

cristobal78

[résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

Bonsoir

après avoir lu bcp sur le forum j'ai trouvé comment obtenir la liste des fichiers modifiés depuis une certaine date :

- j'ai créé un fichier "dateref" en utilisant la commande touch :

touch dateref

- j'ai mis ce fichier à la date souhaitée (ici au 28 déc 2013) :

touch --date 2013-12-28 dateref 

- j'ai mis ce fichier "dateref" dans le /home/user

- Maintenant avec la commande find j'ai cherché les noms de fichiers plus récents que le fichier "dateref" :

find /home/user/ -name "*"  -newer dateref

C'est un peu lourdingue mais ça marche.
Enfin... ça marche à peu près car je me retrouve aussi avec des fichiers du genre ".nomdefichier" donc avec des tas de fichiers cachés dont je n'ai que faire !

Je ne trouve pas comment modifier ma commande find pour n'avoir que les fichiers sans le "point".

Quelqu'un aurai-t-il une astuce ?
Merci et bonne année.

Dernière modification par cristobal78 (Le 10/01/2014, à 20:37)


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#2 Le 02/01/2014, à 07:32

pingouinux

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

Bonjour,

find /home/user/ -name "[^.]*"  -newer ref

Hors ligne

#3 Le 02/01/2014, à 10:54

gigiair

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

Je verrai plutôt un

 find ./ -regex '\./[^.].+' -newer dateref

Mais pour trouver les fichiers modifiés il y a moins de 4 jours, je ferais plutôt

find ./ -regex '\./[^.].+' -mtime -4

Qui me dispense de créer un fichier de référence.


--
JJR.

Hors ligne

#4 Le 02/01/2014, à 12:09

tiramiseb

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

Salut,

Bah moi j'allais proposer un mélange de ce que donnent pingouinux et gigiair :

find /home/user/ -regex "[^.]*"  -mtime -4

Mais c'est vrai que là on ne parle pas d'une date précise, seulement d'un delta par rapport à "aujourd'hui" (ce qui nécessite de calculer à combien de jours ça correspond si on vise une date précise).

Dernière modification par tiramiseb (Le 02/01/2014, à 12:10)

Hors ligne

#5 Le 02/01/2014, à 17:38

gigiair

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

Il y a plein de solutions...
On peut éviter de calculer «à la main » le temps écoulé, la fonction date effectuant la conversion en secondes, puis bc convertissant en minutes:

BUTOIR='2013-12-28 00:00:00' find ./ -regex '\./[^.].+' -mmin $(echo "($(date --date=$BUTOIR +%s) - $(date --date='now' +%s)) / 60"|bc)

J'ai mis la date butoir dans la variable BUTOIR, à ajuster à la demande, pour rendre le code plus clair.


--
JJR.

Hors ligne

#6 Le 02/01/2014, à 17:39

tiramiseb

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

Je dois avouer que là, le passage par un fichier intermédiaire avec "touch" me semble plus facile à mettre en œuvre, comme ça en "one shot".

Bien sûr, si c'est dans le cadre d'un script il vaut mieux faire propre comme tu le proposes !

Hors ligne

#7 Le 02/01/2014, à 18:37

gigiair

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

bc n'est pas nécessaire, puisque les calculs se font en nombre entiers.
Une autre version sans bc et avec -amin au lieu de -mmin (accès en minutes, au lieu de modification)

 find ./ -regex '\./[^.].+' -amin $((($(date --date='2013-12-28 16:45:00' +%s) - $(date --date='now' +%s)) /60))

La fonction date est utilisée pour convertir la date en secondes depuis epoch, le reste est du calcul bien basique.
La seule difficulté est ne nombre de parenthèses nécessité par l'évaluation d'un calcul $(( ...)) en plus de l'évaluation d'une fonction $(...). Avec un bon éditeur, ça va mieux, surtout si l'éditeur est plutôt orienté Lisp...
Voir

info finding files 

pour plus de détails.


--
JJR.

Hors ligne

#8 Le 02/01/2014, à 20:19

cristobal78

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

bonsoir
je vois que mon petit  n'a offert que peu de résistance aux ténors de ces lieux.

Merci à pingouinux  smile pour le "[^.]*"
Bien que je connaisse l''existence de ces opérateurs je ne sais pas où les trouver et donc où les étudier.

Merci à tiramiseb et gigiair smile qui ont attiré mon attention sur le fait qu'on pouvait aussi vouloir les derniers fichiers modifiés depuis un certain nombre de jours (plutôt que depuis une certaine date).

Je vais maintenant mettre ou tenter de mettre tout ça dans un petit script qui permettra de choisir l'un ou l'autre.

Dernière modification par cristobal78 (Le 02/01/2014, à 20:20)


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#9 Le 02/01/2014, à 20:54

gigiair

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

cristobal78 a écrit :

Merci à pingouinux  smile pour le "[^.]*"
Bien que je connaisse l''existence de ces opérateurs je ne sais pas où les trouver et donc où les étudier.

La description en est donnée dans

 info "finding files"

info est un utilitaire indispensable pour apprendre à utiliser une commande, bien plus pédagogique que man (qui n'est qu'un aide mémoire).
Pour apprendre à utiliser info, il suffit de lancer la commande

info info

Pour trouver la citation qui suit, on peut, après avoir tapé info finding files <RET>
taper s puis à linvite taper pattern matching <RET> et enfin m shell <TAB> <RET>.
info complète par ce qui va bien et affiche ceci :

info finding files a écrit :

2.1.4 Shell Pattern Matching
----------------------------

`find' and `locate' can compare file names, or parts of file names, to
shell patterns.  A "shell pattern" is a string that may contain the
following special characters, which are known as "wildcards" or
"metacharacters".

   You must quote patterns that contain metacharacters to prevent the
shell from expanding them itself.  Double and single quotes both work;
so does escaping with a backslash.

`*'
     Matches any zero or more characters.

`?'
     Matches any one character.

`[STRING]'
     Matches exactly one character that is a member of the string
     STRING.  This is called a "character class".  As a shorthand,
     STRING may contain ranges, which consist of two characters with a
     dash between them.  For example, the class `[a-z0-9_]' matches a
     lowercase letter, a number, or an underscore.  You can negate a
     class by placing a `!' or `^' immediately after the opening
     bracket.  Thus, `[^A-Z@]' matches any character except an
     uppercase letter or an at sign.

`\'
     Removes the special meaning of the character that follows it.  This
     works even in character classes.

   In the `find' tests that do shell pattern matching (`-name',
`-wholename', etc.), wildcards in the pattern will match a `.'  at the
beginning of a file name.  This is also the case for `locate'.  Thus,
`find -name '*macs'' will match a file named `.emacs', as will `locate
'*macs''.

   Slash characters have no special significance in the shell pattern
matching that `find' and `locate' do, unlike in the shell, in which
wildcards do not match them.  Therefore, a pattern `foo*bar' can match
a file name `foo3/bar', and a pattern `./sr*sc' can match a file name
`./src/misc'.

   If you want to locate some files with the `locate' command but don't
need to see the full list you can use the `--limit' option to see just
a small number of results, or the `--count' option to display only the
total number of matches.


--
JJR.

Hors ligne

#10 Le 02/01/2014, à 21:05

cristobal78

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

merci gigiair
je ne connaissais que le "man" qui est souvent très "aride" pour le lecteur lambda et ne comporte la plupart du temps que peu ou pas du tout d'exemples. sad
Pourtant c'est toujours vers le "man" qu'on renvoie les poseurs de questions dans le style RTFM !! mad
Je vais donc de ce pas regarder et étudier le fonctionnement de "info".
En attendant j'ai passé mon message initial en "résolu".

Dernière modification par cristobal78 (Le 05/01/2014, à 02:16)


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#11 Le 02/01/2014, à 23:36

gigiair

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

Il y a au moins deux info indispensables : info Finding files et info Coreutils
Toute personne désirant utiliser des commandes en ligne devraient avoir parcouru ces deux fichiers.
Un fichier info est beaucoup plus agréable à parcourir avec Emacs. Ça ne vaut peut être pas le coup d'apprendre à utiliser Emacs pour ça, mais il y a tant de domaines où Emacs excelle que ça peut être une raison supplémentaire d'apprendre.


--
JJR.

Hors ligne

#12 Le 03/01/2014, à 07:02

pingouinux

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

@cristobal78 :
Il faudrait que tu précises les fichiers cachés que tu ne veux pas voir apparaître, car nos différentes propositions ne sont pas équivalentes.
Voici un exemple.

$ tree -a /tmp/tst
/tmp/tst
├── .rep_cache
│   ├── .fic_cache_1
│   └── fic_visible_1
└── rep_visible
    ├── .fic_cache_2
    ├── fic_visible_2
    └── fic_visible.avec_point
$ cd /tmp/tst

$ find -name "[^.]*"                # pingouinux #2
./.rep_cache/fic_visible_1
./rep_visible
./rep_visible/fic_visible_2
./rep_visible/fic_visible.avec_point

$ find ./ -regex '\./[^.].+'        # gigiair #3
./rep_visible
./rep_visible/.fic_cache_2
./rep_visible/fic_visible_2
./rep_visible/fic_visible.avec_point

$ find /tmp/tst/ -regex "[^.]*"     # tiramiseb #4
/tmp/tst/
/tmp/tst/rep_visible
/tmp/tst/rep_visible/fic_visible_2

Édité : Correction faute de frappe

Dernière modification par pingouinux (Le 04/01/2014, à 06:33)

Hors ligne

#13 Le 03/01/2014, à 13:57

Postmortem

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

Salut,

gigiair a écrit :

Il y a plein de solutions...
On peut éviter de calculer «à la main » le temps écoulé, la fonction date effectuant la conversion en secondes, puis bc convertissant en minutes:

BUTOIR='2013-12-28 00:00:00' find ./ -regex '\./[^.].+' -mmin $(echo "($(date --date=$BUTOIR +%s) - $(date --date='now' +%s)) / 60"|bc)

J'ai mis la date butoir dans la variable BUTOIR, à ajuster à la demande, pour rendre le code plus clair.

T'es sûr que ça fonctionne ça ? Pour moi, ça ne fonctionne pas. En effet, la valeur est attribuée à BUTOIR après que $(echo "($(date --date=$BUTOIR +%s) - $(date --date='now' +%s)) / 60"|bc) soit exécuté.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#14 Le 03/01/2014, à 14:25

tiramiseb

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

Postmortem a écrit :

Pour moi, ça ne fonctionne pas. En effet, la valeur est attribuée à BUTOIR après que [...]

Euh non, la définition d'une variable en début de ligne s'applique au contenu de la ligne, elle n'est pas attribuée après.

Par contre, il manque des guillemets autour de "$BUTOIR".

Hors ligne

#15 Le 03/01/2014, à 22:55

Postmortem

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

tiramiseb a écrit :
Postmortem a écrit :

Pour moi, ça ne fonctionne pas. En effet, la valeur est attribuée à BUTOIR après que [...]

Euh non, la définition d'une variable en début de ligne s'applique au contenu de la ligne, elle n'est pas attribuée après.

Par contre, il manque des guillemets autour de "$BUTOIR".

Je maintiens mes propos !
Essaie ceci :

var=toto echo "var vaut $var"

L'expansion des paramètres (et autres expansions) a lieu avant l'affectation des variables. Les affectations comme cela sont utilisées une fois que l'execution se fait.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#16 Le 04/01/2014, à 02:01

cristobal78

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

pingouinux a écrit :

@cristobal78 :
Il faudrait que tu précises les fichiers cachés que tu ne veux pas voir apparaître, car nos différentes propositions ne sont pas équivalentes.
........

Oui je l'ai constaté en écrivant (avec des bouts de commandes lus ici) un brouillon de script qui en plus ne donne pas les mêmes résultats selon que je donne une date ou une durée.
Pour répondre à ta question : je cherche à connaître les fichiers que j'ai modifiés : essentiellement des fichiers  "writer", "calc", "bash".
Aucun de ces fichiers n'a donc de raison d’être préfixé d'un "point". Quant aux fichiers cachés et modifiés par le système -quelqu'ils soient- ils ne m'intéressent pas.

J'ai écrit un script "à ma façon" car je ne suis pas un codeur émérite ce dont les cadors ici pour se rendre aisément compte. Mais le script ne plante pas sauf peut être si on entre n'importe quoi comme "date".
Voici le script-brouillon :

#!/bin/bash
# Nom du script = last-modified
# Fonction du script = liste les fichiers (non cachés) du /home/user qui ont été modifiés depuis une date donnée ou depuis un certains nombre de jours.
# Note = 04.01.2014
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
zenity --info  --width=400 --height=50 --text="Permet de trouver les derniers fichiers modifiés  \n\ndepuis une certaine date \nou bien \ndepuis un certain nombre de jours"

## la date ou la durée ?
choix=`zenity --width=300 --height=200  --text="Choisir de chercher les fichiers depuis une date ou depuis un nombre de jours" --list --separator=" " --column=""  --print-column="1" "jours" "date" `

## nbre de jours ##
if [[ $choix = "jours" ]]
then
	nbrejours=`zenity --width=100 --height=400 --list --title="Choisir un nombre de jour dans la liste("0" pour arrêter)" --text=" " --separator=" " --column="nombre de jours" --print-column="1" 0 1 2 3 7 14 21 28 `
	if [ $nbrejours -eq 0 ] ; then zenity --info --text="Un nombre de jours = 0 met fin au programme\n\nAu revoir"; exit ; fi	# Un nombre de jours = 0 met fin au programme
		echo "Liste des fichiers modifiés depuis $nbrejours jour(s)"		
		sudo find $HOME -regex "[^.]*"  -mtime -$nbrejours
fi
## date du calendrier ##
if [[ $choix = "date" ]]
then
datcal=$(zenity --title="Entrer la date de référence" --entry --text "Entrez la date de référence au format : yyyy-mm-dd")
	touch dateref
	touch --date $datcal dateref 
		echo "liste des fichiers modifiés depuis le $datcal"
		sudo find  -regex '\./[^.].+' -newer dateref
fi
exit

En plus quand je choisis un nombre de jours j'ai une liste des répertoires mais pas les fichiers.
Quand je choisis l'option "date" j'ai bien les fichiers.

Il doit y avoir quelque chose de pourri dans une des lignes smile

Dernière modification par cristobal78 (Le 04/01/2014, à 02:04)


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#17 Le 04/01/2014, à 02:37

Postmortem

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

Salut,
Pour la recherche :

find nom_repertoire -name '.*' -prune -o -type f -newer dateref -print

Ça ne cherchera pas dans les répertoires commençant par point et ne devrait pas non plus afficher les fichiers commençant par point.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#18 Le 04/01/2014, à 10:21

tiramiseb

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

Postmortem a écrit :

L'expansion des paramètres (et autres expansions) a lieu avant l'affectation des variables. Les affectations comme cela sont utilisées une fois que l'execution se fait.

Au temps pour moi.

En effet, l'expansion de bash se fait avant l'affectation des variables. J'avais en tête les cas où les programmes utilisent des vars d'environnement, mais dans ce cas elles ne sont pas traitées par bash mais bien par le programme.

Hors ligne

#19 Le 04/01/2014, à 10:35

gigiair

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

Postmortem a écrit :

Essaie ceci :

var=toto echo "var vaut $var"

L'expansion des paramètres (et autres expansions) a lieu avant l'affectation des variables. Les affectations comme cela sont utilisées une fois que l'execution se fait.

Merci pour cette judicieuse intervention.
Et si j'interpose un ;

var=toto; echo "var vaut $var"

Il y a des effets de bord ?


--
JJR.

Hors ligne

#20 Le 04/01/2014, à 11:03

tiramiseb

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

Il y a des effets de bord ?

La valeur "toto" sera toujours dans la variable "var" après l'exécution de la commande : cette assignation n'est plus spécifique à cette commande.

C'est comme si tu le faisais sur deux lignes.

Hors ligne

#21 Le 04/01/2014, à 13:18

pingouinux

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

cristobal78 #16 a écrit :

En plus quand je choisis un nombre de jours j'ai une liste des répertoires mais pas les fichiers.
Quand je choisis l'option "date" j'ai bien les fichiers.

Le find n'est pas le même dans les deux cas.

Cas 1

sudo find $HOME -regex "[^.]*"  -mtime -$nbrejours

Tu ne listes que les fichiers ou répertoires dont le chemin complet ne contient aucun point

Cas 2

sudo find  -regex '\./[^.].+' -newer dateref

Il faut que tu sois au préalable dans le bon répertoire, et tu listes les fichiers ou répertoires dont le chemin complet ne commence pas par ./.

Tu peux jeter un œil à mes essais en #12

Hors ligne

#22 Le 05/01/2014, à 02:15

cristobal78

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

@ pingouinux    #21

le cas 1, travaillant sur un NOMBRE de jours
renvoie bien des répertoires non cachés mais ne liste pas les fichiers (cachés ou non) qu'ils contiennent.  sad
En gros ça dit : "ce répertoire à été modifié". C'est sympa mais ça ne me dit pas quels fichiers de ce répertoire ont été modidiés.
Ça ne répond donc pas vraiment à la question car le répertoire sera considéré comme modifié alors que peut être un seul fichier de ce répertoire a été modifié.
Ce que  je veux obtenir c'est la liste des fichiers de ce répertoire qui ont été modifiés et juste ceux là et sans avoir à fouiller dans le répertoire considéré comme modifié.

le cas 2, travaillant sur une DATE
renvoie la liste des fichiers modifiés avec le chemin complet.
Ça c'est que je cherche à obtenir.  smile

Donc en fait mon pb n'est pas résolu... pour l'instant smile


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#23 Le 05/01/2014, à 03:48

Postmortem

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

Bonsoir,
Et ça, ça marche pas ??

Postmortem a écrit :

Salut,
Pour la recherche :

find nom_repertoire -name '.*' -prune -o -type f -newer dateref -print

Ça ne cherchera pas dans les répertoires commençant par point et ne devrait pas non plus afficher les fichiers commençant par point.

Si c'est bon, ça sera aussi ok avec :

find nom_repertoire -name '.*' -prune -o -type f -mtime -$nbrejours -print

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#24 Le 05/01/2014, à 09:03

pingouinux

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

cristobal78 #22 a écrit :

renvoie bien des répertoires non cachés mais ne liste pas les fichiers (cachés ou non) qu'ils contiennent.

Peux-tu donner le chemin complet d'un fichier qui devrait apparaître et que tu ne vois pas ? Il suffit d'un seul point (.) dans le chemin ou le nom du fichier pour qu'il ne soit pas sélectionné.

Hors ligne

#25 Le 05/01/2014, à 11:45

cristobal78

Re : [résolu] trouver les derniers fichiers modifiés (sans les fich cachés)

@ postmortem
....
Si c'est bon, ça sera aussi ok avec :

find nom_repertoire -name '.*' -prune -o -type f -mtime -$nbrejours -print

Oui ça marche mieux que la ligne de mon script brouillon qui contenait

sudo find $HOME -regex "[^.]*"  -mtime -$nbrejours

@ pingouinux
...Peux-tu donner le chemin complet d'un fichier qui devrait apparaître et que tu ne vois pas ?...

la cde me donnait par exemple "/home/user/banque" (par exemple) comme répertoire dont le contenu avait été modifié
mais ne me disait pas que le fichier " /home/user/banque/relevés-2013.ods" avait été modifié.

De tout façon merci à vous 2 qui m'ont fait découvrir de nouvelles choses.
Je vais tester sur plusieurs jours pour voir comment se comporte mon script et comparer ce que donne la recherche sur une date ou sur un nbre de jours.

Il y aura je pense tjrs une petite différence.

En effet le fichier dateref est toujours à 00:00 hrs donc si le 5 janvier à 10:40 on cherche le fichiers depuis le 4 janvier on aura les fichiers sur 1 jour complet (toute la journée du 04.01.2014) plus[ les fichiers sur 10:40 hrs du jour en cours.

Si on demande les fichiers depuis 1 jour on aura (sans doute) exactement 24 hrs d'historique donc un peu moins de fichiers que dans le 1-er cas.
C'est vrai ça ????????????


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne