[commande unix] cut sur tout espace blanc (résolu)

Autres projets et contributions
Répondre
Avatar de l’utilisateur
cassyb
Chu Ko Nu
Messages : 310
Inscription : jeu. 04 janv. 2007, 09:07

[commande unix] cut sur tout espace blanc (résolu)

Message par cassyb » jeu. 20 sept. 2007, 16:23

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.
Dernière modification par cassyb le lun. 24 sept. 2007, 10:59, modifié 1 fois.

Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03
Contact :

Message par tuxce » jeu. 20 sept. 2007, 17:04

salut,
je suppose que tu veux plutot la 6eme col?

Code : Tout sélectionner

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

Avatar de l’utilisateur
wain
Maître du Kyudo
Messages : 1854
Inscription : ven. 11 août 2006, 19:15
Localisation : Nancy (54)
Contact :

Message par wain » jeu. 20 sept. 2007, 17:49

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 ;)

Avatar de l’utilisateur
cassyb
Chu Ko Nu
Messages : 310
Inscription : jeu. 04 janv. 2007, 09:07

Message par cassyb » jeu. 20 sept. 2007, 19:09

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?

Avatar de l’utilisateur
wain
Maître du Kyudo
Messages : 1854
Inscription : ven. 11 août 2006, 19:15
Localisation : Nancy (54)
Contact :

Message par wain » jeu. 20 sept. 2007, 20:53

vite fait:
for file in *; do
[ `stat -c %Y $file` -lt $((`date +%s` - 50000000)) ] && echo "$file"
done
où 50000000 est l'âge en secondes

Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03
Contact :

Message par tuxce » ven. 21 sept. 2007, 02:05

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

Avatar de l’utilisateur
cassyb
Chu Ko Nu
Messages : 310
Inscription : jeu. 04 janv. 2007, 09:07

Message par cassyb » ven. 21 sept. 2007, 08:27

@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.

Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03
Contact :

Message par tuxce » ven. 21 sept. 2007, 11:42

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.

Avatar de l’utilisateur
bapt
Daikyu
Messages : 85
Inscription : jeu. 20 sept. 2007, 09:20
Contact :

Message par bapt » ven. 21 sept. 2007, 12:45

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.

Avatar de l’utilisateur
cassyb
Chu Ko Nu
Messages : 310
Inscription : jeu. 04 janv. 2007, 09:07

Message par cassyb » ven. 21 sept. 2007, 13:25

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
Dernière modification par cassyb le ven. 21 sept. 2007, 14:18, modifié 4 fois.

Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03
Contact :

Message par tuxce » ven. 21 sept. 2007, 13:36

Code : Tout sélectionner

if [ "$USER" = "cassy" ]
#....
enfin, le plus important était les espaces

Avatar de l’utilisateur
cassyb
Chu Ko Nu
Messages : 310
Inscription : jeu. 04 janv. 2007, 09:07

Message par cassyb » ven. 21 sept. 2007, 13:42

merci!

Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03
Contact :

Message par tuxce » ven. 21 sept. 2007, 13:51

t'as édité ton post? c'est quoi le souci en fin de compte?

Avatar de l’utilisateur
cassyb
Chu Ko Nu
Messages : 310
Inscription : jeu. 04 janv. 2007, 09:07

Message par cassyb » ven. 21 sept. 2007, 14:30

@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.

Avatar de l’utilisateur
wain
Maître du Kyudo
Messages : 1854
Inscription : ven. 11 août 2006, 19:15
Localisation : Nancy (54)
Contact :

Message par wain » sam. 22 sept. 2007, 09:55

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]

Avatar de l’utilisateur
bapt
Daikyu
Messages : 85
Inscription : jeu. 20 sept. 2007, 09:20
Contact :

Message par bapt » sam. 22 sept. 2007, 19:11

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 ...

Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03
Contact :

Message par tuxce » sam. 22 sept. 2007, 22:32

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

Avatar de l’utilisateur
cassyb
Chu Ko Nu
Messages : 310
Inscription : jeu. 04 janv. 2007, 09:07

Message par cassyb » lun. 24 sept. 2007, 10:58

for file in `find /mnt/ext3backup -maxdepth 1 -mtime +7`; do
....
done
nikel merci.

Répondre