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/09/2017, à 14:36

qolepam

lister les derniers fichiers par dossier

bonjour,

Je ne maîtrise pas en totalité les commandes unix.
question simple:
quelle commande pour lister le dernier fichier(en date de création ou de modification) de chaque dossier et sous-dossier?

merci de votre aide

Hors ligne

#2 Le 02/09/2017, à 18:07

cqfd93

Re : lister les derniers fichiers par dossier

Bonjour,

man ls

Un tout petit extrait :

       --sort=WORD
              sort  by  WORD instead of name: none (-U), size (-S), time (-t),
              version (-v), extension (-X)

       --time=WORD
              with -l, show time as WORD instead of default modification time:
              atime  or  access  or  use  (-u); ctime or status (-c); also use
              specified time as sort key if --sort=time (newest first)

cqfd93

En ligne

#3 Le 03/09/2017, à 01:02

qolepam

Re : lister les derniers fichiers par dossier

en fait une réponse partielle est:
ls  -R  -t
mais cette commande unix liste tous les fichiers récents de chaque dossier et sous-dossier.

Je cherche une commande ou un script listant le seul et dernier fichier en date de chaque dossier et sous dossier,sans devoir se préoccuper d'une valeur précise à introduire du temps en arrière,comme par exemple find -mtime -valeur_précise

Hors ligne

#4 Le 03/09/2017, à 05:17

moko138

Re : lister les derniers fichiers par dossier

ls -lt /ton/dossier | grep -Ev "^d|total" | head -1

  - -
Et si tu veux inclure les fichiers cachés :

ls -lat /ton/dossier | grep -Ev "^d|total" | head -1

Par contre, je ne sais pas combiner ces commandes avec l'option -R.

Dernière modification par moko138 (Le 03/09/2017, à 05:23)


%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel :  À la découverte de dcraw

Hors ligne

#5 Le 03/09/2017, à 06:08

pingouinux

Re : lister les derniers fichiers par dossier

Bonjour,
Peut-être ceci, qui est une adaptation de la commande de moko138 en #4 :

find -type d -printf "\n%p\n" -exec bash -c "ls -lat '{}' | grep -Ev '^d|total' | head -1" \;

Correction : Au cas où les noms de répertoires contiennent des espaces

Dernière modification par pingouinux (Le 03/09/2017, à 09:53)

Hors ligne

#6 Le 03/09/2017, à 08:57

Compte anonymisé

Re : lister les derniers fichiers par dossier

@pingouinux tu as du oublié le ";" à la fin de la ligne

#7 Le 03/09/2017, à 09:55

pingouinux

Re : lister les derniers fichiers par dossier

Merci Anonyme68, le copier-coller était en effet un peu court. C'est corrigé.

Hors ligne

#8 Le 03/09/2017, à 12:48

qolepam

Re : lister les derniers fichiers par dossier

pourrait-on m'expliquer la signification de ^d|total ?

Hors ligne

#9 Le 03/09/2017, à 13:40

pingouinux

Re : lister les derniers fichiers par dossier

qolepam #8 a écrit :

pourrait-on m'expliquer la signification de ^d|total ?

... grep -Ev '^d|total' ...

C'est pour ne pas tenir compte des lignes commençant par d (répertoires) et de celles contenant total (récapitulatif du répertoire courant).
Il serait d'ailleurs préférable de faire :

find -type d -printf "\n%p\n" -exec bash -c "ls -lat '{}' | grep -Ev '^d|^total' | head -1" \;

pour ne pas éliminer les fichiers contenant le mot total, ni les utilisateurs ou groupes contenant ce mot.

Hors ligne

#10 Le 03/09/2017, à 13:44

moko138

Re : lister les derniers fichiers par dossier

"d" : directory,  =  répertoire.

Ainsi,
si tu as aussi des liens (retour à la ligne+"l") à exclure,
tu remplaceras "^d|^total" par "^d|^l|^total".

Dernière modification par moko138 (Le 03/09/2017, à 13:45)


%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel :  À la découverte de dcraw

Hors ligne

#11 Le 03/09/2017, à 14:02

qolepam

Re : lister les derniers fichiers par dossier

dernier point:
que veut dire ^?
c'est l'exclusion?

par exemple si j'écris:
find chemin_répertoire| grep "^faq"
cela me trouve tous les fichiers qui ne contiennent pas faq?

Hors ligne

#12 Le 03/09/2017, à 14:51

pingouinux

Re : lister les derniers fichiers par dossier

que veut dire ^?
c'est l'exclusion?

Non, ce caractère représente un début de ligne.

grep "^faq"

Va rechercher toutes les lignes commençant par faq.

Hors ligne

#13 Le 03/09/2017, à 14:51

moko138

Re : lister les derniers fichiers par dossier

man grep | grep -A2 "v,"

Et plus généralement

man grep

%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel :  À la découverte de dcraw

Hors ligne

#14 Le 03/09/2017, à 16:14

Watael

Re : lister les derniers fichiers par dossier

mais qu'est-ce que vous avez fait hier soir ?

find ~ -maxdepth 1 -type f -printf '%T@ %p\n' | sort -k1,1 -rn | cut -d ' ' -f2- | head -n1

ou

\ls -aR1Ft ~ | tail -n +2 | egrep -v '(\*|\/|=|>|@|\|)$' | head -n1

ou c'est moi qui ne suis encore bien réveillé... hmm

Dernière modification par Watael (Le 03/09/2017, à 17:13)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#15 Le 03/09/2017, à 16:49

moko138

Re : lister les derniers fichiers par dossier

Watael a écrit :

ou c'est moi qui ne suis encore bien réveillé... hmm

Euh... tu sais quand même qu'on est dimanche soirbig_smile

Dernière modification par moko138 (Le 03/09/2017, à 16:50)


%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel :  À la découverte de dcraw

Hors ligne

#16 Le 03/09/2017, à 17:00

qolepam

Re : lister les derniers fichiers par dossier

le head à la fin ne résout de loin mon problème car j'ai une arborescence de sous-dossiers où pour chacun d'entre eux je cherche l'unique fichier le plus récent!
Comment faire?

Hors ligne

#17 Le 03/09/2017, à 17:09

Watael

Re : lister les derniers fichiers par dossier

ls est une mauvaise solution.

je n'ai pas fait attention à la sortie particulière de l'option -R, --recursive de ls.
je préfère, de beaucoup, utiliser find, qui permet un affichage fin des données relatives à un fichier.

find est une meilleure solution.

Dernière modification par Watael (Le 03/09/2017, à 17:12)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#18 Le 03/09/2017, à 17:37

moko138

Re : lister les derniers fichiers par dossier

qolepam a écrit :

le head à la fin ne résout de loin mon problème car j'ai une arborescence de sous-dossiers où pour chacun d'entre eux je cherche l'unique fichier le plus récent!

Je ne comprends pas en quoi la solution de pingouinux en #9 ne te convient pas.
Veux-tu la liste des fichiers sans leurs répertoires ? Ce serait illisible, il me semble.
Veux-tu inclure ou exclure les répertoires masqués ?


%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel :  À la découverte de dcraw

Hors ligne

#19 Le 03/09/2017, à 17:46

nam1962

Re : lister les derniers fichiers par dossier

Pas tout à fait la réponse, mais j'utilise parfois

find -cmin -x

pour trouver les fichiers récemment changés (x est le nombre de minutes concerné par la requète)

Dernière modification par nam1962 (Le 03/09/2017, à 17:47)


[ Modéré ]

Hors ligne

#20 Le 03/09/2017, à 19:02

qolepam

Re : lister les derniers fichiers par dossier

merci c''est bon avec find!

Hors ligne

#21 Le 04/09/2017, à 15:41

LeoMajor

Re : lister les derniers fichiers par dossier

bonjour,

le find (+ cron facultatif) n'est pas du tout performant. Cela peut suffire si tu veux juste une photographie à l'instant t, mais c'est insuffisant en terme de gestion des évènements file system.
à toi de voir.

le dernier fichier(en date de création ou de modification)...

cela revient à surveiller l'évènement IN_CLOSE_WRITE, sous inotify, si tu veux pousser le bouchon plus loin.  Après, je ne sais pas ce que tu veux faire avec, dans le contexte script ( "une action", des actions, sur ledit fichier ?!, sur untel(s) dossier(s) )

par exemple avec iwatch sur la 16.04 qui simule le incron (inotify +cron) de la 14.04.

exemple test-iwatch.service qui surveille le dossier Téléchargements

un téléchargement de firefox, un wget, nano, gedit, ou touch provoquera un évènement IN_CLOSE_WRITE

cat /etc/systemd/system/test-iwatch.service

[Unit]
Description= Start test-iwatch.bash
Documentation= man:systemd.service

[Service]
Type=forking
ExecStart=/usr/local/bin/test-iwatch.bash

cat /usr/local/bin/test-iwatch.bash

#!/bin/bash
iwatch -d -f /etc/iwatch/iwatch.d/10-test_iwatch.xml

cat /etc/iwatch/iwatch.d/10-test_iwatch.xml

<?xml version="1.0" ?>
<!DOCTYPE config SYSTEM "/etc/iwatch/iwatch.dtd" >

<config charset="utf-8">
  <guard email="toto@domain.tld" name="IWatch"/>
  <watchlist>
    <title>Only Test</title>
    <contactpoint email="toto@domain.tld" name="Administrator"/>
  <!--  <path type="recursive" events="close_write" alert="off" exec="echo $(date +%R:%N):%c:%e:%f >> /tmp/test_iwatch.txt">/home/toto/Téléchargements</path>    -->
        <path type="recursive" events="close_write" alert="off" exec="/usr/local/bin/test-action-event.bash d /home/toto/Téléchargements %f %e">/home/toto/Téléchargements</path>
  </watchlist>
</config>
systemctl enable test-iwatch.service
systemctl start test-iwatch.service
systemctl status test-iwatch.service
● test-iwatch.service - Start test-iwatch.bash
   Loaded: loaded (/etc/systemd/system/test-iwatch.service; static; vendor preset: enabled)
   Active: active (running) since dim. 2017-09-03 14:55:42 CEST; 24h ago
     Docs: man:systemd.service
  Process: 12633 ExecStart=/usr/local/bin/test-iwatch.bash (code=exited, status=0/SUCCESS)
 Main PID: 12636 (iwatch)
   CGroup: /system.slice/test-iwatch.service
           └─12636 /usr/bin/perl -T /usr/bin/iwatch -d -f /etc/iwatch/iwatch.d/10-test_iwatch.xml

tu remarqueras aussi que tu peux appeler un script à chaque évènement (/usr/local/bin/test-action-event.bash), puisque tous les arguments sont connus.

cat /usr/local/bin/test-action-event.bash

#!/bin/bash
#/usr/local/bin/test-action-event.bash d /home/toto/Téléchargements %f %e
logfile=/tmp/test-action-event.log
ev[0]=$(date +%F%R%S%N) #date
ev[1]=$1 #type source: dossier(d),fichier(f),application(p) pid
ev[2]=$2 #source
ev[3]=$3 #déclencheur
ev[4]=$4 #évènement
mimef=$(file -bi "${ev[3]}")

action() {
...
}

action

echo "${ev[*]}" >> "$logfile"
exit 0

en préliminaire, tu peux t'amuser avec

inotifywait -d -e close_write -o /home/toto/test-inotify.log --timefmt '%R:%S' --format '%T:%w%f:%e' --exclude /home/toto/test-inotify.log  /home/toto/Téléchargements/

iwatch -e close_write -c 'echo $(date +%F:%R:%N):%c:%e:%f >> /tmp/test_iwatch.txt' -r /home/toto/Téléchargements

il y a aussi systemd.path, qui utilise une variante, approche, d'inotify.

Hors ligne