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?

Code : Tout sélectionner

ls -lrt --time-style +%s | awk -F ' ' '{print $6}'

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:

Code : Tout sélectionner

ls -lrt --time-style +%s | awk '{print $6}'

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:

Code : Tout sélectionner

find . -maxdepth 1 -mtime -x
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 -

Code : Tout sélectionner

find . -maxdepth 1 -mtime +1 -exec une_commande \{\} \;
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

Code : Tout sélectionner

if [ "$USER" = "cassy" ]
#....
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.