#1 Le 02/09/2017, à 13: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, à 17: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, à 00: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, à 04: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, à 04:23)
%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel : À la découverte de dcraw
Hors ligne
#5 Le 03/09/2017, à 05: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, à 08:53)
Hors ligne
#6 Le 03/09/2017, à 07: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, à 08: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, à 11: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, à 12:40
- pingouinux
Re : lister les derniers fichiers par dossier
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, à 12: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, à 12:45)
%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel : À la découverte de dcraw
Hors ligne
#11 Le 03/09/2017, à 13: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, à 13: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, à 13: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, à 15: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é...
Dernière modification par Watael (Le 03/09/2017, à 16:13)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#15 Le 03/09/2017, à 15:49
- moko138
Re : lister les derniers fichiers par dossier
ou c'est moi qui ne suis encore bien réveillé...
Euh... tu sais quand même qu'on est dimanche soir ?
Dernière modification par moko138 (Le 03/09/2017, à 15:50)
%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel : À la découverte de dcraw
Hors ligne
#16 Le 03/09/2017, à 16: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, à 16: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, à 16:12)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#18 Le 03/09/2017, à 16:37
- moko138
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!
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, à 16: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, à 16:47)
[ Modéré ]
Hors ligne
#20 Le 03/09/2017, à 18:02
- qolepam
Re : lister les derniers fichiers par dossier
merci c''est bon avec find!
Hors ligne
#21 Le 04/09/2017, à 14: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