Résolu le 8-06-19 Comment supprimer plusieurs répertoires en faisant des exceptions pour certains fichiers et sous-répertoires

Questions concernant les lignes de commandes
Répondre
Avatar du membre
amilcar
Messages : 98
Enregistré le : jeu. 26 nov. 2015 07:18
Localisation : 59138
Contact :

Comment supprimer plusieurs répertoires en faisant des exceptions pour certains fichiers et sous-répertoires

Message par amilcar »

Bonjour,
je sais même pas si j'ai le droit de poster ici ce genre de message, je tente si je suis "OFF" un gentil admin vire le topic ;)

Mon soucis. je me suis fais un petit serveur lamp, avec dedans plusieurs sites et dedans plusieurs répertoire et dedans .....
bref

je dois effacer tous les répertoire sauf certains et je sais pas comment prendre le pb

le répertoire qu'il faudrait balayé est sites de plus il faudrais exclure un sous répertoire
- sites
-- A
--- /IMG
--- /config
--- /local
--- /squelettes
--- /tmp
--- .htacess
--- .user.ini
- B
--- /IMG
--- /config
--- /local
--- /squelettes
--- /tmp
--- .htacess
--- .user.ini
- C
--- /IMG
--- /config
--- /local
--- /squelettes
--- /tmp
--- .htacess
--- .user.ini

donc supprimer tous les répertoires se trouvant dans A , B , C sauf /IMG,/config,/local,/squelettes,/tmp et les fichiers .htacess, .user.ini
sachant que le nom des répartoire A B C n'est pas connu.

moi j'été parti sur mais ça le fait pas fraudais que je liste les repertoires a effacé

Code : Tout sélectionner

 #!/bin/sh

ROOT=/home/

exception=(
	spipfactory.fr
)

# effacement éventuel fichier /site/*/plugins
for dir in "$ROOT/"web/sites/*/plugins; do
	unset aSupp
	for except in "${exception[@]}"; do
		if [[ $dir =~ /$except/ ]]; then
			aSupp=no
			continue
		fi
	done
	if [[ $aSupp != "no" ]]; then
		echo destruction "${dir}" >> "logs_$( basename "$0" )"
		rm -fr "$dir"
	fi
done
exit

je pensais me tourner vers

Code : Tout sélectionner

find ./* \( ! -name 'IMG' -a ! -name 'config' -a ! -name 'local' -a ! -name 'squelettes' - a ! -name 'tmp' -a ! -name '.htaccess' - a ! -name '.user.ini' \) -exec rm {} \;
Modifié en dernier par arghlub le mer. 30 janv. 2019 17:18, modifié 2 fois.
Raison : modification du titre et ajout de balises "code"
System: Kernel: 4.15.0-51-generic x86_64 bits: 64 compiler: gcc v: 7.3.0
Desktop: Cinnamon 4.0.10 wm: muffin dm: LightDM Distro: Linux Mint 19.1 Tessa
base: Ubuntu 18.04 bionic
Machine: Type: Portable System: Dell product: Inspiron N5110 v
CPU: Dual Core model: Intel Core i3-2310M bits: 64 type
Graphics: NVIDIA GF108M [GeForce GT 525M]
Drives: Local Storage: total: 465.76 GiB
Partition: ID-1: / size: 457.45 GiB used: 16.15 GiB (3.5%) fs: ext4 dev: /dev/sda1

zeb
Messages : 16473
Enregistré le : ven. 19 juin 2015 22:13
Localisation : plus ici

Re: BASH

Message par zeb »

Salut ;)
amilcar a écrit :
mer. 30 janv. 2019 11:00
je sais même pas si j'ai le droit de poster ici ce genre de message, je tente si je suis "OFF" un gentil admin vire le topic ;)
Pas de soucis, par contre le titre :l tu n'en aurais pas un plus mieux bien ? ;)

Avatar du membre
arghlub
Administrateur du site
Messages : 10421
Enregistré le : dim. 21 mai 2017 08:19
Localisation : Provence
Contact :

Re: BASH

Message par arghlub »

Salut,

Tu pourrais faire bien plus simple avec cette commande :

Code : Tout sélectionner

sudo rm -rf /chemin/vers/sites/*/!(IMG|config|local|squelettes|tmp|\\.htaccess|\\.user.ini)
/!\ Attention à la commande “rm” si elle est utilisée avec sudo, verifie à 2fois que tu as bien mis la bonne syntaxe (sans espace mal placé dans le chemin par exemple), car ça peut être très dangereux si tu fais une erreur.

Petite explication rapide de la commande :
  • rm -rf : effacer “récursivement” (en incluant les sous-répertoires) et de manière “forcée” ;
  • * : n'importe quel(s) caractère(s) ---> dans le chemin après le répertoire sites/ pour prendre en compte n'importe quel sous-répertoire ;
  • ! : négation ---> !(IMG) : fichiers (ou répertoires) dont le nom est différent de IMG ;
  • | : ou ---> !(IMG|config) : fichiers dont le nom est différent de IMG ou config ;
  • \\ : double échappement pour que le point . en début des noms de fichier (.htaccess et .user.ini) ne soit pas interprété par le Bash.
;)
Tour1 (custom)CM MSI Z270 M3 | CPU Intel I7-7700K | CG Nvidia GTX 1080 | RAM 16Go | tripleBoot : Debian 11 | MXlinux 21 | LMint 19.3 | XFCE
Tour2 (custom)CM Gigabyte | CPU AMD Athlon 5200+ | CG Nvidia GTX 560 | RAM 6Go | FreeBSD 12.1 XFCE
Portable1 MSI GF75 Thin 9SC | CPU Intel I7-9750H | CG Nvidia GTX 1650 | RAM 32Go | dualBoot : LMint 20.2 | MXlinux 21 | XFCE
Portable2 MacBook Air A1466 (2015) | CPU Intel I5-5250U | CG Intel HD Graphics 6000 | RAM 8Go | dualBoot : macOS Sierra | MXlinux 21 XFCE
─────( pour une informatique libre ! -membre en stand-by de l' April.org────────────────

Avatar du membre
arghlub
Administrateur du site
Messages : 10421
Enregistré le : dim. 21 mai 2017 08:19
Localisation : Provence
Contact :

Re: Comment supprimer plusieurs répertoires en faisant des exceptions pour certains fichiers et sous-répertoires

Message par arghlub »

zeb a écrit :
mer. 30 janv. 2019 11:03
par contre le titre :l tu n'en aurais pas un plus mieux bien ? ;)
Finalement je l'ai fait à la place d'amilcar car effectivement “Bash” était un titre plus que limite :l :l (@amilcar, tu pourras toujours le modifier comme tu veux). ;)
Tour1 (custom)CM MSI Z270 M3 | CPU Intel I7-7700K | CG Nvidia GTX 1080 | RAM 16Go | tripleBoot : Debian 11 | MXlinux 21 | LMint 19.3 | XFCE
Tour2 (custom)CM Gigabyte | CPU AMD Athlon 5200+ | CG Nvidia GTX 560 | RAM 6Go | FreeBSD 12.1 XFCE
Portable1 MSI GF75 Thin 9SC | CPU Intel I7-9750H | CG Nvidia GTX 1650 | RAM 32Go | dualBoot : LMint 20.2 | MXlinux 21 | XFCE
Portable2 MacBook Air A1466 (2015) | CPU Intel I5-5250U | CG Intel HD Graphics 6000 | RAM 8Go | dualBoot : macOS Sierra | MXlinux 21 XFCE
─────( pour une informatique libre ! -membre en stand-by de l' April.org────────────────

Avatar du membre
cyrille
Administrateur du site
Messages : 12395
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Comment supprimer plusieurs répertoires en faisant des exceptions pour certains fichiers et sous-répertoires

Message par cyrille »

Sinon , autre façon de procéder (c'est ainsi que je fais en PHP)

Tu colles dans un tableau les dossiers et fichiers que tu ne veux pas supprimer

Puis tu lances un test en comparant la boucle ls -R avec les valeurs de ce tableau.
Si correspondance on n'efface si pas correspondance, on efface.

Sinon la version d'arghlub marche nickel, c'est dans cette direction (option de rm que je me serai tourner aussi en premier)

Juste un autre moyen de faire

Voici l'exemple que ça donne en php (ici on supprime rien, on affiche ou non le fichier ou le dossier sur une page d'indexation automatiquement
(mais sle fond est le même). A adapter en bash sans trop de pb

Code : Tout sélectionner

<?php
		# Liste le contenu du répertoire
		$target = '/home/XXXXX/www/';
		$weeds = array('.', '..','test', 'FL9','.htaccess', 'index.php', 'img', 'backupSql', 'style.css', 'pdf.gif','robots.txt');
		$directories = array_diff(scandir($target), $weeds);

		foreach($directories as $value)
			{ 
				if(is_dir($target.$value)) { echo '<img src="img/folder.jpg" width="20" height="20" alt="dossier"> [ DIR ] <a href="'.$value.'">'.  $value.'</a><br />'; }
			}
		?>
</td>
<td  class="petit" valign="top">
		<?php
		foreach($directories as $value)
			{
			if(!is_dir($target.$value)) { echo '<img src="img/file.jpg" width="20" height="20" alt="fichier"> [ FILE ] <a href="'.$value.'">'.  $value.'</a><br />'; }
 	 	}
		?>
Mes 2 sous
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
amilcar
Messages : 98
Enregistré le : jeu. 26 nov. 2015 07:18
Localisation : 59138
Contact :

Re: Comment supprimer plusieurs répertoires en faisant des exceptions pour certains fichiers et sous-répertoires

Message par amilcar »

Hummmmm merci beaucoup pour la piste ...
et le petit cours fort sympathique est très utile , ça c'est de la réponse ;)

j'aime bien aussi quand on propose des alternatives le coté php par exemple

donc j'en arrive a ça, je vous le soumet avant de tester

Code : Tout sélectionner

# effacement de tous les sous répertoire de /sites sauf spipfactory.fr
# et de tous les sous répertoires et fichiers IMG, config, local, squelettes, tmp, .htaccess, .user.in
	
find . \( ! -name "spipfactory.fr" \) -exec rm -rf */!(IMG|config|local|squelettes|tmp|\\.htaccess|\\.user.ini) {} \;
et pour essayer d'expliquer
find . \( ! -name "spipfactory.fr" \) balaye tous les dossiers mais exclu spipfactory.fr
-exec execute la commande situé juste a prés
rm -rf */!(IMG|config|local|squelettes|tmp|\\.htaccess|\\.user.ini)


vous en pensez quoi ?, ça peu le faire ? ou .....
System: Kernel: 4.15.0-51-generic x86_64 bits: 64 compiler: gcc v: 7.3.0
Desktop: Cinnamon 4.0.10 wm: muffin dm: LightDM Distro: Linux Mint 19.1 Tessa
base: Ubuntu 18.04 bionic
Machine: Type: Portable System: Dell product: Inspiron N5110 v
CPU: Dual Core model: Intel Core i3-2310M bits: 64 type
Graphics: NVIDIA GF108M [GeForce GT 525M]
Drives: Local Storage: total: 465.76 GiB
Partition: ID-1: / size: 457.45 GiB used: 16.15 GiB (3.5%) fs: ext4 dev: /dev/sda1

Avatar du membre
cyrille
Administrateur du site
Messages : 12395
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Comment supprimer plusieurs répertoires en faisant des exceptions pour certains fichiers et sous-répertoires

Message par cyrille »

Bah teste sur une copie de ton répertoire et tu seras vite fixé ;)
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
arghlub
Administrateur du site
Messages : 10421
Enregistré le : dim. 21 mai 2017 08:19
Localisation : Provence
Contact :

Re: Comment supprimer plusieurs répertoires en faisant des exceptions pour certains fichiers et sous-répertoires

Message par arghlub »

oui fais des tests en copiant ton répertoire "sites"...

mais pourquoi tu tiens absolument à faire des "find" ????
y'a pas besoin, les find c'est hyper-lourd.
un find relit tout les fichiers, inutile de faire un processus find pour l'envoyer dans un rm....
c'est pour optimiser le code bien sûr .... pourquoi faire simple quand on peut faire compliqué :roll:

un précepte de codeur est le "kiss" .... KISS= "Keep It Simple Stupid"....
un rm en une ligne suffit sans avoir besoin de se lustrer la banane. ;)
Tour1 (custom)CM MSI Z270 M3 | CPU Intel I7-7700K | CG Nvidia GTX 1080 | RAM 16Go | tripleBoot : Debian 11 | MXlinux 21 | LMint 19.3 | XFCE
Tour2 (custom)CM Gigabyte | CPU AMD Athlon 5200+ | CG Nvidia GTX 560 | RAM 6Go | FreeBSD 12.1 XFCE
Portable1 MSI GF75 Thin 9SC | CPU Intel I7-9750H | CG Nvidia GTX 1650 | RAM 32Go | dualBoot : LMint 20.2 | MXlinux 21 | XFCE
Portable2 MacBook Air A1466 (2015) | CPU Intel I5-5250U | CG Intel HD Graphics 6000 | RAM 8Go | dualBoot : macOS Sierra | MXlinux 21 XFCE
─────( pour une informatique libre ! -membre en stand-by de l' April.org────────────────

Avatar du membre
amilcar
Messages : 98
Enregistré le : jeu. 26 nov. 2015 07:18
Localisation : 59138
Contact :

Re: Comment supprimer plusieurs répertoires en faisant des exceptions pour certains fichiers et sous-répertoires

Message par amilcar »

entièrement d'accord pour faire simple ... :lol:

du coup pour exclure le répertoire spipfactory.fr ?

Code : Tout sélectionner

rm -rf /chemin/vers/sites/*/!(spipfactory.fr|IMG|config|local|squelettes|tmp|\\.htaccess|\\.user.ini)
je vais tester demain .... :x


mais pourquoi suis je parti avec find ?
System: Kernel: 4.15.0-51-generic x86_64 bits: 64 compiler: gcc v: 7.3.0
Desktop: Cinnamon 4.0.10 wm: muffin dm: LightDM Distro: Linux Mint 19.1 Tessa
base: Ubuntu 18.04 bionic
Machine: Type: Portable System: Dell product: Inspiron N5110 v
CPU: Dual Core model: Intel Core i3-2310M bits: 64 type
Graphics: NVIDIA GF108M [GeForce GT 525M]
Drives: Local Storage: total: 465.76 GiB
Partition: ID-1: / size: 457.45 GiB used: 16.15 GiB (3.5%) fs: ext4 dev: /dev/sda1

Avatar du membre
arghlub
Administrateur du site
Messages : 10421
Enregistré le : dim. 21 mai 2017 08:19
Localisation : Provence
Contact :

Re: Comment supprimer plusieurs répertoires en faisant des exceptions pour certains fichiers et sous-répertoires

Message par arghlub »

amilcar a écrit :
mer. 30 janv. 2019 19:48
du coup pour exclure le répertoire spipfactory.fr ?

Code : Tout sélectionner

rm -rf /chemin/vers/sites/*/!(spipfactory.fr|IMG|config|local|squelettes|tmp|\\.htaccess|\\.user.ini)
voilà.... fais un test sur une copie mais je suis (quasi) sûr de moi sur cette commande simple.
amilcar a écrit :
mer. 30 janv. 2019 19:48
mais pourquoi suis je parti avec find ?
je sais pas :roll: ;) ... car un "find /" analyse tous les fichiers de ton système, ça peut durer un moment. ;)
Tour1 (custom)CM MSI Z270 M3 | CPU Intel I7-7700K | CG Nvidia GTX 1080 | RAM 16Go | tripleBoot : Debian 11 | MXlinux 21 | LMint 19.3 | XFCE
Tour2 (custom)CM Gigabyte | CPU AMD Athlon 5200+ | CG Nvidia GTX 560 | RAM 6Go | FreeBSD 12.1 XFCE
Portable1 MSI GF75 Thin 9SC | CPU Intel I7-9750H | CG Nvidia GTX 1650 | RAM 32Go | dualBoot : LMint 20.2 | MXlinux 21 | XFCE
Portable2 MacBook Air A1466 (2015) | CPU Intel I5-5250U | CG Intel HD Graphics 6000 | RAM 8Go | dualBoot : macOS Sierra | MXlinux 21 XFCE
─────( pour une informatique libre ! -membre en stand-by de l' April.org────────────────

Répondre