#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
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 {} \;
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à )
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
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
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.
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
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,
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