OVH Cloud OVH Cloud

Supprimer des fichiers

7 réponses
Avatar
Al 1
bonjour

j'ai un r=E9pertoire qui contient plein de fichiers
et une liste qui m'indique les fichiers utiles

je voudrais r=E9ussir =E0 supprimer les fichiers qui n'apparaissent pas d=
ans
ma liste

pour l'instant j'y arrive en faisant (bash) :

----
mkdir to_keep
awk '{print $2}' liste_fichiers | sort | uniq | while read i; do
mv $i to_keep
done
rm -f *
mv to_keep/* .
rmdir to_keep
----

m=E9thode affreuse =E0 mon go=FBt !

est-ce qu'il n'y a pas un coup de find possible =E0 la place du while qui=

dirait 'trouve la liste des fichiers qui ne correspond pas' ? enfin qui
ferait:
| find . -not_in_list_of_stdin -exec rm '{}' \;

j'ai bien pens=E9 =E0 une solution avec xargs, mais j'ai peur que si la
liste grossisse, la commande soit splitt=E9e

7 réponses

Avatar
Stephane CHAZELAS
Le Mon, 13 Oct 2003 09:20:03 +0200, Al 1 écrivait :
j'ai un répertoire qui contient plein de fichiers
et une liste qui m'indique les fichiers utiles

je voudrais réussir à supprimer les fichiers qui
n'apparaissent pas dans ma liste
[...]


Tu peux faire (zsh, bash, ksh sur certains systemes)

comm -2 -3 <(find . -type f -print | sort) <(sort list.txt)
| sed 's/./&/g' | xargs rm -f

(en supposant que list.txt contienne:
./fic1.txt
./dir/fic2.txt
...
et que les noms des fichiers ne contiennent pas de sauts de
ligne évidemment)

Sinon, tu peux aussi faire (en moins efficace):

find . -type f ! -exec grep -Fxq {} list.txt ;
-exec rm -f {} ;


--
Stéphane

Avatar
Stephane CHAZELAS
Le Mon, 13 Oct 2003 09:20:03 +0200, Al 1 écrivait :
[...]
mkdir to_keep
awk '{print $2}' liste_fichiers | sort | uniq | while read i; do
mv $i to_keep
done


Ou

{ awk '{print $2 "n" $2}' liste_fichiers; ls
} | sort | uniq -u | sed 's/./&/g' | xargs rm -f

--
Stéphane

Avatar
Al 1
Stephane CHAZELAS a écrit:
{ awk '{print $2 "n" $2}' liste_fichiers; ls
} | sort | uniq -u | sed 's/./&/g' | xargs rm -f



merci
mais celui-là j'ai du mal à le comprendre:
les lignes seront doublées par le awk, donc ?!
il y aura des lignes en double et des lignes en triple, et aucune ligne
seule ?

j'aurais dit

{ awk '{print $2}' liste_fichiers; ls
} | sort | uniq -u | sed 's/./&g' | xargs rm -f

Avatar
Stephane CHAZELAS
Le Mon, 13 Oct 2003 15:43:36 +0200, Al 1 écrivait :
Stephane CHAZELAS a écrit:
{ awk '{print $2 "n" $2}' liste_fichiers; ls
} | sort | uniq -u | sed 's/./&/g' | xargs rm -f



mais celui-là j'ai du mal à le comprendre:
les lignes seront doublées par le awk, donc ?!
il y aura des lignes en double et des lignes en triple, et aucune ligne
seule ?


Ben si, les fichiers à effacer retournés par "ls".
(note que j'ai pas testé ma solution, toutefois).

j'aurais dit

{ awk '{print $2}' liste_fichiers; ls
} | sort | uniq -u | sed 's/./&g' | xargs rm -f


Oui, afficher 2 fois "$2", c'était pour plus de sureté (au
moins on est sur que les "$2" ne sont pas effacés (par exemple,
si tu y avais mis un "dotfile", il n'aurait pas été affiché par
"ls", il se serait trouvé en simple et sélectionné par "uniq
-u" et donc effacé alors qu'il était justement censé etre
préservé).

--
Stéphane


Avatar
Al 1
Stephane CHAZELAS a écrit:
Tu peux faire (zsh, bash, ksh sur certains systemes)

comm -2 -3 <(find . -type f -print | sort) <(sort list.txt)
| sed 's/./&/g' | xargs rm -f

(en supposant que list.txt contienne:
./fic1.txt
./dir/fic2.txt
...


hum, cette solution m'a effacé tous mes fichiers !
j'ai retenu la 3eme (avec le awk '{print $2"n"$2'}), merci

Avatar
kanze
Stephane CHAZELAS wrote in message
news:...
Le Mon, 13 Oct 2003 09:20:03 +0200, Al 1 écrivait :
[...]
mkdir to_keep
awk '{print $2}' liste_fichiers | sort | uniq | while read i; do
mv $i to_keep
done


Ou

{ awk '{print $2 "n" $2}' liste_fichiers; ls
} | sort | uniq -u | sed 's/./&/g' | xargs rm -f


Intéressant, mais j'aurais crû que quelque chose du genre :

ls | diff - liste_fichiers | sed -n 's/^< //p' | xargs rm -f

aurait été bien plus simple. À condition évidemment que la liste des
fichiers soit triée aussi (mais sinon, c'est assez facile à faire
aussi).

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16


Avatar
Stephane CHAZELAS
Le 14 Oct 2003 06:18:19 -0700, écrivait :
[...]
Intéressant, mais j'aurais crû que quelque chose du genre :

ls | diff - liste_fichiers | sed -n 's/^< //p' | xargs rm -f

aurait été bien plus simple. À condition évidemment que la liste des
fichiers soit triée aussi (mais sinon, c'est assez facile à faire
aussi).


"comm" est plus adapté que "diff" ici, voir ma première réponse.

--
Stéphane