Page 1 sur 1
[commande unix] cut sur tout espace blanc (résolu)
Publié : jeu. 20 sept. 2007, 16:23
par cassyb
salut,
J'ai un ptit soucis avec une commande...
Je fais un:
ls -lrt --time-style +%s
et j'aimerais récupérer la 3ème colonne...
j'ai essayé de faire ça avec cut
genre:
ls -lrt --time-style +%s | cut -d' ' -f4
pour avoir la quatrième colonne...
le problème c'est s'il y a par exemple deux espaces blancs, b'hein j'suis baisée.
Comment faire un cut sur tout espace blanc?
merci.
cassy.
Publié : jeu. 20 sept. 2007, 17:04
par tuxce
salut,
je suppose que tu veux plutot la 6eme col?
Publié : jeu. 20 sept. 2007, 17:49
par wain
comme tuxce, pour moi a pas mieux que awk pour faire ça.
Autre avantage, on a pas besoin de lui indiquer quel est le séparateur. Il sait reconnaître automatiquement une suite d'espaces ou une tabulation comme une séparation.
donc ceci est suffisant:
ps: en plus awk est beaucoup plus rapide. Dans les traitements répétitifs on sent la différence
Publié : jeu. 20 sept. 2007, 19:09
par cassyb
merci à vous deux.
je suppose que tu veux plutot la 6eme col?
Non pas que la 6ème colonne en fait.
J'aimerais savoir comment parcourir ligne par ligne le resultat du ls -lrt --time-style +%s
genre:
while (ls -lrt --time-style +%s)
do
if(le timestamp de la ligne courante < timestamp_calculé)
echo "ça fait trop longtemps que t'as pas modifié ton répertoire"
done
une idée?
Publié : jeu. 20 sept. 2007, 20:53
par wain
vite fait:
for file in *; do
[ `stat -c %Y $file` -lt $((`date +%s` - 50000000)) ] && echo "$file"
done
où 50000000 est l'âge en secondes
Publié : ven. 21 sept. 2007, 02:05
par tuxce
si le timestamp de référence n'est pas précis au delà d'un jour, tu as aussi ce genre de commande:
avec x le nombre de jours minimum entre la dernière modif et aujourd'hui
Publié : ven. 21 sept. 2007, 08:27
par cassyb
@tuxce:
cette commande est puissante, mais c'est l'inverse que je recherche...
les repertoires qui n'ont pas été modifiés depuis x jours...
Mais comment tu fais pour parcourir le resultat dans une boucle après?
@wain:
j'étais tombé sur un script de ce genre sur commentcamarche.net, mais je pensais que c'était trop couteux...
dans chaque itération tu testes la date...ce que je cherchais c'est une commande qui filtrerait la date dès le départ pour juste avoir à parcourir le resultat (forcément avec moins d'iterations), récupérer facilement le user avec awk ou stat et envoyer un mail.
Je vais faire une première version du script avec ta solution wain puis je verrais plus tard si je trouve une façon moins couteuse de le faire.
Publié : ven. 21 sept. 2007, 11:42
par tuxce
pour avoir l'inverse, il suffit de mettre + au lieu de -
ne parcours que le répertoire courant et execute la commande "une_commande" sur chaque nom de fichier non modifié depuis 2 jours.
Publié : ven. 21 sept. 2007, 12:45
par bapt
si zsh ne te gêne pas, tu peux le faire en pur shell (pas d'invocation externe)
Code : Tout sélectionner
for rep in *(/^m-2);do
echo ""ça fait trop longtemps que t'as pas modifié ton répertoire : $rep"
done
dans la parenthèse / veux dire uniquement les répertoires
^ veux que les expressions qui suivent seront la négation de leur signification normale
m-2 : modifier ces 2 dernier jours.
mM-2 : donner les 2 dernier mois
mw-2 : les 2 dernières semaines
mh : heures
mm : minutes
ms : secondes,
etc.
Si tu remplaces le premier m par a tu as la modification sur la date d'accès, par c sur les inodes.
Publié : ven. 21 sept. 2007, 13:25
par cassyb
Code : Tout sélectionner
#!/bin/bash
#verifier si le disk est monte
if ! mount | grep -q "/dev/mapper/ext3backup"
then
echo "le disque externe n'est pas monte"
else
for file in /mnt/ext3backup/*
do
if [ `stat -c "%Y" "$file"` -lt $((`date +%s` - 60*60*24*8)) ]
then
USER=`stat -c "%U" "$file"`
case "$USER" in
cassy)
EMAIL="cassy@arch.fr"
ACTIVE="1";;
user2)
EMAIL="user2@arch.fr"
ACTIVE="0";;
user3)
EMAIL="user3@arch.fr"
ACTIVE="1";;
# usern)
*)
ACTIVE="0";;
esac
if [ "$ACTIVE" = "1" ]
then
(
echo To: $EMAIL
echo From: robot_de_dev@arch.fr
echo Subject: Rappel de sauvegarde sur dev
echo "${USER}, n'oublie pas de lancer la sauvegarde de temps en temps."
) | /usr/sbin/sendmail -t -i -frobot_de_dev@arch.fr $EMAIL
fi
fi
done
fi
Publié : ven. 21 sept. 2007, 13:36
par tuxce
enfin, le plus important était les espaces
Publié : ven. 21 sept. 2007, 13:42
par cassyb
merci!
Publié : ven. 21 sept. 2007, 13:51
par tuxce
t'as édité ton post? c'est quoi le souci en fin de compte?
Publié : ven. 21 sept. 2007, 14:30
par cassyb
@bapt:
seduisant mais je n'ai pas zsh...
@tuxce:
aucun soucis ça marche.
J'ai édité car le script peut interresser quelqu'un (genre s'il recherche sendmail)
find . -maxdepth 1 -mtime +1 -exec une_commande \{\} \;
Je n'ai pas encore utiliser ta commande car dans l'accolade exec j'ai un peu de traitement...
y'aurait-il moyen d'utiliser ta commande dans le script?
peut-on faire un:
for i in (find /mnt/ext3backup -maxdepth 1 -mtime +7)
à la place de
for file in /mnt/ext3backup/*
quelle serait la syntaxe?
merci.
Publié : sam. 22 sept. 2007, 09:55
par wain
sans utiliser exec, ça donne tout simplement ceci:
Code : Tout sélectionner
for file in `find /mnt/ext3backup -maxdepth 1 -mtime +7`; do
....
done
@bapt: vraiment très intéressantes ce genre de fonctions dans zsh ![/code]
Publié : sam. 22 sept. 2007, 19:11
par bapt
wain a écrit :
@bapt: vraiment très intéressantes ce genre de fonctions dans zsh !
zsh regorge de petites fonctionnalités excellentes de ce type là
et comme je ne me lasse pas du prosel, vous aurez régulièrement le droit à des petits trucs zsh maintenant que je traine ici
sauf si vous me dites que je suis trop lourd ...
Publié : sam. 22 sept. 2007, 22:32
par tuxce
au contraire, c'est toujours intéressant d'avoir plusieurs facons de résoudre un problème, et puis, si ca nous fait découvrir zsh en plus... c'est tout bénéf
Publié : lun. 24 sept. 2007, 10:58
par cassyb
for file in `find /mnt/ext3backup -maxdepth 1 -mtime +7`; do
....
done
nikel merci.