Je dois supprimer tous les fichiers d'un répertoire, mais en exclure certains. Par exemple, dans un répertoire contenant les fichiers a b c ... z
, je dois tout supprimer, à l'exception de u
et p
. Y a-t-il un moyen facile de faire ceci?
Je dois supprimer tous les fichiers d'un répertoire, mais en exclure certains. Par exemple, dans un répertoire contenant les fichiers a b c ... z
, je dois tout supprimer, à l'exception de u
et p
. Y a-t-il un moyen facile de faire ceci?
Réponses:
Ce que je fais dans ces cas est de taper
rm *
Ensuite , je presse Ctrl+ X, *pour développer *
dans tous les noms de fichiers visibles.
Ensuite, je peux simplement supprimer les deux fichiers que je souhaite garder de la liste et enfin exécuter la ligne de commande.
*
s’allonge ne s’allonge pas trop. : -}
Ctrl
+ Shift
+ x
+*
Pour rm
tous sauf u,p
en bash, tapez simplement:
rm !(u|p)
Cela nécessite la définition de l'option suivante:
shopt -s extglob
Voir aussi: glob - Greg's Wiki
shopt -s extglob
, @Ashot. En outre, il ne s'agit que de fichiers, pas de répertoires, c'est pourquoi j'ai supprimé les -rf
options de votre commande.
rm !(index).html
. Cela supprimera tous les fichiers se terminant par ".html" à l'exception de "index.html".
Vous pouvez utiliser find
find . ! -name u ! -name p -maxdepth 1 -type f -delete
!
nie la prochaine expression-name
spécifie un nom de fichier-maxdepth 1
fera que le processus de recherche ne contienne que le répertoire spécifié ( find
par défaut, il traverse les répertoires)-type f
traitera uniquement les fichiers (et pas par exemple les répertoires)-delete
va supprimer les fichiersVous pouvez ensuite régler les conditions en consultant la page de manuel de find.
Mise à jour
Testez d'abord votre commande en utilisant -print
au lieu de-delete
find . ! -name u ! -name p -maxdepth 1 -type f -print
-delete
juste après, .
ce sera une catastrophe (tous les fichiers de la CWD seront supprimés)
find . -maxdepth 1 -type f -name '[^up]' -delete
find
est mon meilleur ami, surtout quand il y a trop de fichiers dans le monde entier
Facile:
mv
les fichiers que vous voulez dans un répertoire supérieur, rm
le répertoire et ensuite mv
les retourner.
rm
sans -r
supprimer les sous-répertoires.
Un peu similaire à cette réponse , mais aucune option particulière sont nécessaires, pour autant que je sache ce qui suit est « ancienne » fonctionnalités prises en charge par un (vaguement) / bin / sh ressemblant shell (par exemple bash, zsh, ksh, etc.)
rm [^up]
rm [^up]*
? Je fais des choses similaires assez souvent.
Le faire sans trouver:
ls | grep -v '(u|p)' | xargs rm
(Edit: "u" et "v", comme à d'autres endroits ici, sont utilisés comme versions génériques de expressions rationnelles entières. Évidemment, vous voudrez bien faire attention à ancrer vos expressions rationnelles pour éviter de faire correspondre trop de choses.)
Vous allez certainement vouloir un script si vous allez faire beaucoup de cela, comme d'autres l'ont suggéré.
-E
ouegrep
u
ou unp
grep -L (u|p)' * | xargs rm
où -L
signifie les noms de fichiers de liste ne contenant pas de correspondance.
u
ou p
pas un fichier contenant un u
ou p
. C'est correct. Vous pouvez réparer en utilisantegrep -v '^(u|p)$'
ls | grep -v 'vuze\|progs' | xargs rm -rf
À l'époque des disquettes, j'avais un exécutable DOS appelé "Except" qui déplacerait temporairement les éléments du répertoire en cours et exécuterait une commande. Vous pourriez donc dire:
sauf * .txt del *. *
pour tout supprimer sauf vos fichiers texte.
Ce serait une chose assez triviale à implémenter en tant que script shell et si c'est le genre de chose que vous ferez probablement plus de deux fois, cela semble être une bonne idée.
find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;
Cela supprimera tous les fichiers sauf u et p sous unix
Pour ceux qui préfèrent spécifier des motifs d'exclusion complexes arbitraires (couvrant tous les noms de fichiers affectés) dans un style reacxp complet, emacs, posix-awk ou posix-extended (voir la page de manuel find), je recommanderais celui-ci. Il exclut u
et p
dans le répertoire en cours dans cet exemple. Cela peut être utile pour les scripts.
find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
-regextype
ne fonctionnera que sur les versions GNU
find
s'agit d'une extension de find
commande GNU . La même chose s'applique pour l' -regextype
option. En outre, votre commande supprimera également les fichiers des sous-répertoires, alors que la question d'origine visait clairement à définir les fichiers d'un répertoire.
Encore un autre:
for FILE in ./*; do if [[ $FILE != ./u* ]] || [[ $FILE != ./p* ]];then rm $FILE; fi; done;
C'est un peu long et je ne sais pas si vous pourriez facilement en faire une fonction qui pourrait facilement contenir un nombre arbitraire d'arguments, mais cela fonctionne bien.
Et c'est de la pure bonté.
Voici une autre variante. Vous pouvez taper:
rm -i *
ou:
rm --interactive *
Nous rm
vous demanderons donc de confirmer la suppression de chaque fichier.
Utilisation:
find . -type f ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
find . -type d ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
afin de supprimer tous les fichiers, y compris les répertoires, à l'exception des fichiers u, p et .ext.
Un moyen simple et difficile à gâcher: disons que vous voulez tout supprimer sauf * .pdf:
mkdir tmp
mv *.pdf tmp
rm *
mv tmp/* .
rm -r tmp