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 17/11/2012, à 17:51

Otyugh

[résolu]Trouver fichiers vide

Salut,
pour trouver les fichiers/rep de taille 0, je fais

ls -s | grep ^0 | cut -d" " -f2-

J'en suis content en temps normal. Seulement en bash, c'est inutilisable.

dossier1 :
dossier vide/
dossier a/
b d

En faisant un for sur le résultat de ce "ls" j'obtiens seulement soit les champs en "dossier" "vide" "dossier" "a" "b" "d".
J'ai aussi tenté un for x in "$(ls ...)" ; pas mieux, tout tombe sur une ligne "dossier vide dossier a b d".

Ce que j'aurais voulu c'est que dans une boucle, je prenne une valeur d'une ligne du résultat du ls... Sans se faire avoir par les espaces.
Je sais pas si je suis clair, mon exemple est pas terrible hmm

Dernière modification par Otyugh (Le 18/11/2012, à 06:00)

Hors ligne

#2 Le 17/11/2012, à 18:03

Watael

Re : [résolu]Trouver fichiers vide

salut,

trouver : find
fichier : -type f
vide : -empty

après, si tu veux exécuter quelques commandes sur les fichiers trouvés : -exec command {} \;
wink


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

Hors ligne

#3 Le 17/11/2012, à 18:31

Otyugh

Re : [résolu]Trouver fichiers vide

Ça sonne assez extraordinairement simple dit comme ça, je m'en vais tester de suite ! (après, une idée de mise en forme longue pour la partie "commande" ? Parce que c'est qu'une partie du traitement en fait ^^

(nah, cependant faut que je le dise, j'vous aime, vous. Et les chouettes réponses que j'y trouve, j'ai déjà gagné des heures de casse-tête éventuel, là big_smile)

Dernière modification par Otyugh (Le 17/11/2012, à 18:36)

Hors ligne

#4 Le 17/11/2012, à 18:48

Bousky

Re : [résolu]Trouver fichiers vide

Otyugh a écrit :

une idée de mise en forme longue pour la partie "commande" ?

Tu l'écrit comme sur la ligne de commande, en remplaçant le nom du fichier trouvé par « {} » et en terminant la ligne par « \; ».


Linux qui plante complètement ? Plus rien ne répond ? On peut toujours le redémarrer proprement :
Alt + SysRq + REISUB (Retourne En Islande Sur Un Bateau !)

Hors ligne

#5 Le 17/11/2012, à 19:24

Otyugh

Re : [résolu]Trouver fichiers vide

J'ai un autre soucis. Soit ça n'a rien à voir, soit c'est le cause de ce que j'ai, donc à tout hasard...

function getName {
    basename "$1"
    #suite du script...
}  

#need 1 argument
if [ $# -eq 1 ]
then
    find $1 -empty -exec echo $(traite {}) \;
else
    echo "il faut donner le repertoire ou commencer le traitement"
fi

Il se trouve qu'il y a une malédiction qui fait que dès que je pense pouvoir aller dans le vif du sujet, je coince !
Donc en fait ici, basneme ne travaille pas.
Je veux dire qu'il rend le chemin, comme si de rien était (comme si c'était seulement un echo $1). Si par contre j'utilise basename à la main dans un terminal, aucun souci. D'où ça vient, merde ? x)

Hors ligne

#6 Le 17/11/2012, à 21:40

Bousky

Re : [résolu]Trouver fichiers vide

Le résultat de la commande basename est affiché sur la sortie standard (le terminal, quoi). Pour récupérer cette valeur, il faut écrire :

variable="$(basename "$1")"

ou l'utiliser dans une commande :

commande "$(basename "$1")"

Note : tu devrais mettre des guillemets doubles autour de « $1 » dans la ligne avec le find


Linux qui plante complètement ? Plus rien ne répond ? On peut toujours le redémarrer proprement :
Alt + SysRq + REISUB (Retourne En Islande Sur Un Bateau !)

Hors ligne

#7 Le 18/11/2012, à 03:41

Otyugh

Re : [résolu]Trouver fichiers vide

Voici le problème plus clairement : même code que précédemment, fonction "traite".

    #echo $1;
    #echo "$(basename "$1")";
    #echo "$1" | cut -d'/' -f$(echo "$1" | awk '{ print NF+1 }')

Ces trois codes ont EXACTEMENT la même sortie. (et seul "echo $1" a un résultat auquel on aurait pu s'y attendre. Y-a-t-il une explication rationnelle ?

Hors ligne

#8 Le 18/11/2012, à 03:57

Hizoka

Re : [résolu]Trouver fichiers vide

je ne sais pas si ca t'irait mais voila une idée :

while read file
do
  # traitement de chaque fichier
  # la variable contenant le nom du fichier est ${file}
  base_nom="${file##*/}"
  echo "Le nom complet du fichier est : ${file}
et son nom raccourci est : ${base_nom}"
done < <(find "${1}" -type f -empty)

ainsi si la fonction ne servait qu'a être appelée, on peut s'en passer smile

Dernière modification par Hizoka (Le 18/11/2012, à 03:58)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#9 Le 18/11/2012, à 04:34

Otyugh

Re : [résolu]Trouver fichiers vide

Ça fonctionne parfaitement, bien que cette écriture ne m'est pas trop familière ^^

Cependant, j'enrage un peu de ne pas saisir "pourquoi rien ne marchait" précédemment. hmm
Mais merci, la solution fonctionnelle est là.

Hors ligne

#10 Le 18/11/2012, à 05:42

Hizoka

Re : [résolu]Trouver fichiers vide

tres pratique ces boucles while smile

si c'est ok, un petit resolu alors.


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#11 Le 18/11/2012, à 13:12

Postmortem

Re : [résolu]Trouver fichiers vide

Salut,

Otyugh a écrit :

En faisant un for sur le résultat de ce "ls" j'obtiens seulement soit les champs en "dossier" "vide" "dossier" "a" "b" "d".
J'ai aussi tenté un for x in "$(ls ...)" ; pas mieux, tout tombe sur une ligne "dossier vide dossier a b d".

Ce que j'aurais voulu c'est que dans une boucle, je prenne une valeur d'une ligne du résultat du ls... Sans se faire avoir par les espaces.

Pour la boucle for, on ne l'utilise jamais avec ls, cela provoque les erreurs que tu as rencontrées dès qu'il y a des espaces.
Il faut faire ainsi :

$ shopt -s dotglob # Permet à * de prendre en compte les fichiers/répertoires cachés (commençant par . )
$ for i in *
> do
> echo "--->$i<---"
> ls -ld "$i"
> done
--->dossier pas vide<---
drwxrwxr-x 2 XXXXX XXXXX 4096 nov.  18 11:22 dossier pas vide
--->dossier vide<---
drwxrwxr-x 2 XXXXX XXXXX 4096 nov.  18 10:32 dossier vide
--->fichier pas vide<---
-rw-rw-r-- 1 XXXXX XXXXX 5 nov.  18 10:55 fichier pas vide
--->fichier vide<---
-rw-rw-r-- 1 XXXXX XXXXX 0 nov.  18 10:54 fichier vide

Tu remarqueras qu'il faut bien entourer la variable $i avec des doubles-quottes.

Pour lister les fichiers vides, il faut faire ainsi :

$ shopt -s dotglob
$ for i in *
> do
> [[ -s $i ]] || echo "Fichier --->$i<--- est vide"
> done
Fichier --->fichier vide<--- est vide

Entre [[ ]], il n'est pas nécessaire d'entourer la variable de doubles-quottes (mais ça mange pas de pain de les mettre ! )

Pour voir si un dossier est vide, on ne peut pas se fier à sa taille, il faut regarder s'il contient quelque chose :

$ shopt -s dotglob
$ for i in *
> do
> [[ -s $i ]] || echo "Fichier --->$i<--- est vide"
> [ -d "$i" ] && [ ! -e "$i"/* ] && echo "Dossier --->$i<--- est vide"
> done
Dossier --->dossier vide<--- est vide
Fichier --->fichier vide<--- est vide

Contrairement à [[ ]], entre [ ], il faut entourer les variables de doubles-quottes.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#12 Le 18/11/2012, à 20:14

Otyugh

Re : [résolu]Trouver fichiers vide

Pourquoi de telles réponses viennent qu'après le brainfuck monumental qui m'a permis de faire fonctionner la chose, mais de manière totalement  affreuse ?!

Quoiqu'il en soit, je vais garder ça en tête pour tous mes prochains exercices du type. Pour l'instant, je... Je vais me reposer. Merci pour tout.

Dernière modification par Otyugh (Le 18/11/2012, à 20:14)

Hors ligne