Script Bash pour supprimer tous les fichiers et répertoires à l'exception de celles qui sont spécifiques à
Je suis en train d'écrire un très simple shell Bash script qui va cd dans un répertoire spécifique, il va supprimer tous les fichiers et répertoires à l'exception de quelques rares ceux qui sont sélectionnés et ensuite cd d'origine dir.
Mon code est:
#!/bin/bash
cd /path/to/desired/directory
shopt -s extglob
rm !\(filename1\|filename2\|filename3\) -rf
cd -
J'ai essayé beaucoup de différentes manières d'écrire les symboles '(' et '|', avec des guillemets simples ou doubles ou barre oblique inverse, mais rien n'a fonctionné. Notez que shopt -s extglob
et rm !(filename1|filename2) -rf
beau travail à l'extérieur d'un script.
Probablement que je suis en train d'accomplir un standard et fondamental bash: erreur de script que je ne peux pas le voir, mais l'expérience est à venir...
Toutes suggestions!?
Merci à l'avance.
Êtes-vous sûr que
rm !(filename1|filename2) -rf
fonctionne bien à l'extérieur d'un script? J'aurais attendu rm -rf !(filename1|filename2)
à la place (avec l'option avant le opérandes).J'ai lu à plusieurs reprises. Je suis également en utilisant les options sur
rm
après la dépose de temps à autre. Peut-être que c'est un peu incohérent, mais il a toujours travaillé pour moi. @mario, vous n'avez pas à revenir le répertoire avec cd -
car un shell interne est exécuté est utilisé lors de l'exécution de votre script.OK, 'cd' est un détail, peut-être pas nécessaire. Merci de remarquer.
Oui, je suis sûr qu'il fonctionne. Rhe position des options -abc... devrait ne joue aucun rôle.
OriginalL'auteur mario go | 2013-11-05
Vous devez vous connecter pour publier un commentaire.
Deux problèmes que je peux voir à droite au large de la chauve-souris:
-rf
argumentrm
doit venir avant les noms de fichiers!
,(
,|
et)
devrait pas être échappé avec des barres obliques inversesEssayez plutôt ceci:
Si cela ne fonctionne toujours pas, retirez la
-f
argument, et vous obtenez des messages d'erreur au sujet de ce qui va mal en silence au lieu de les réprimer. Pour imprimer le nom de chaque fichier supprimé, vous pouvez ajouter le-v
option.J'ai trouvé l'erreur. J'étais confus bash, sh (dont la différence, je ne comprends toujours pas). rm-rf !(fichier1|fichier2|nom_fichier3) ainsi que des rm !(fichier1|fichier2|nom_fichier3) -rf fonctionnent aussi bien à l'extérieur et à l'intérieur du script. Pourquoi les prescripteurs doivent pas être marqués avec barre oblique inverse?
Je reçois
bash: !: event not found
avec bash 4.3.11. Il semble que j'ai oublié d'ajouter le shopt ligne.OriginalL'auteur Adam Rosenfield
Si vous avez une version récente de
find
, puis utilisez:Vérifiez la sortie et remplacer
-print
avec-delete
si elle imprime uniquement les fichiers que vous voulez vraiment supprimer.Si votre version de
find
ne prend pas en charge-delete
, utilisez-type f -exec rm "{}" \;
Noter que ce sera seulement supprimer les fichiers. Ce qui est important: Si vous dites à conserver le fichier
x
mais ce fichier est dans un dossiery
, alors il serait ignorerx
seulement pour le supprimer plus tard, avec l'ensemble du dossiery
.De se débarrasser de tous les dossiers vides (et ce en préservant les fichiers que vous souhaitez conserver):
(source: Comment Trouver et Supprimer les dossiers Vides et les Fichiers sous Unix)
OriginalL'auteur Aaron Digulla
Essayer ci-dessous:
Bonne Chance!
Digulla à des espaces, essayez ceci: for i in
ls | grep -v '"new folder"\|file2\|file3'
; do rm-rf $i; done1. Vous avez besoin des guillemets autour de
$i
, trop. 2. "nouveau dossier" sera partagé parfor
ennew
etfolder
.Digulla oui, vous avez raison.
OriginalL'auteur Nancy
Je ne recommande pas d'essayer d'écrire une règle pour exclure certains fichiers. Ce que je voudrais être plus susceptibles de le faire, serait d'essayer et de trouver un filemask/glob, ou une autre ancre dans les noms des fichiers que vous voulez supprimer, les fichiers que vous souhaitez conserver, n'a pas. Dans la plupart des cas, vous pourriez probablement faire que par extension. Malheureusement, parce que vous n'avez pas mentionné ce que les noms de tous les fichiers, je ne peux pas vous aider plus précisément.
Quelque chose comme deux (ou plus) de trouver des boucles:-
Si non, regardez pour une autre caractéristique commune des fichiers. Si il n'existe pas, vous pourriez avoir besoin pour renommer vos fichiers afin de vous donner une. J'ai toujours mis beaucoup d'ancres (séparez-les champs nom, extensions, etc) dans mes noms de fichiers, parce que de cette façon j'ai beaucoup de façons différentes de faire ce dont j'ai besoin avec eux. Nom de mon habitude format est le suivant:-
Signes Plus dans le domaine de l'séparateurs, les tirets sont des espaces, mais sans les tirets comme premier ou dernier caractère. Toutes les lettres en minuscule, et aucun des caractères de contrôle ou d'autres non-alphanumériques permis. En conséquence, je peux le réduire avec awk, cut, ou tout autre chose que je veuille utiliser, et de les renommer facilement. Mettre l'extension au début du nom, qui signifie aussi que les ls ne nécessite qu'un drapeau (-l) pour obtenir un parfaitement ordonné du système de fichiers.
Si vous savez comment utiliser votre structure de répertoire comme une base de données avec la base POSIX outils, parfois, vous n'aurez pas besoin d'installer quoi que ce soit plus compliqué, pour faire ce que vous voulez.
Vous avez une longue limite caractères des noms de fichiers sous UNIX, ainsi que la saisie semi-automatique pour la navigation autour des noms longs. N'ayez pas peur de faire un usage libéral de deux d'entre eux.
OriginalL'auteur petrus4
en supposant que vous avez des fichiers:
Que vous pouvez faire:
ls | grep -v "nodel.\+" | xargs rm -rf
à l'utilisation avancée de la syntaxe regexp pour exclure des fichiers.
Explication:
ls --- les listes de répertoire courant (ls -d lister les répertoires)
grep -v --- v indicateur spécifie ce qui ne CORRESPONDENT PAS + grep permet d'écrire de style perl regexp si vous fournissez option-P
xargs - - - - applique d'action "rm -rf" sur chacun des éléments
OriginalL'auteur Mr. BeatMasta