J'ai un répertoire contenant un grand nombre de fichiers. Je veux supprimer tous les fichiers à l'exception de fichier.txt. Comment puis-je faire cela?
Il y a trop de fichiers pour supprimer les fichiers indésirables individuellement et leurs noms sont trop divers pour pouvoir être * supprimés, à l'exception de ce fichier.
Quelqu'un a suggéré d'utiliser
rm !(file.txt)
Mais ça ne marche pas. Il retourne:
Badly placed ()'s
Mon système d'exploitation est Scientific Linux 6.
Des idées?
file-management
Kantura
la source
la source
Réponses:
POSIXly:
supprimera tous les fichiers normaux (récursivement, y compris ceux cachés) sauf
file.txt
. Pour supprimer des répertoires, passez-type f
à-type d
et ajoutez une-r
option àrm
.Dans
bash
, pour l'utiliserrm -- !(file.txt)
, vous devez activer extglob :(ou en appelant
bash -O extglob
)Notez que
extglob
ne fonctionne que dansbash
et la famille de shell Korn. Et utiliserrm -- !(file.txt)
peut provoquer uneArgument list too long
erreur.Dans
zsh
, vous pouvez utiliser^
pour annuler le motif avec extendedglob activé:ou en utilisant la même syntaxe avec
ksh
etbash
avec les optionsksh_glob
etno_bare_glob_qual
activé.la source
rm
asecho rm
et demande aux gens de ne supprimer l’écho que s’ils sont vraiment certains que cela fera ce qu’ils veulent. Autre que cela, +1 pour la réponse approfondie-delete
au lieu de-exec
, plus court et plus facile à retenir-delete
n'est pas défini par POSIX.find
solution Gnouc, vous pouvez le faire! \( -name one_file -o -name two_file \)
, etc.Une autre prise dans une direction différente (si et seulement s'il n'y a pas d'espaces dans les noms de fichiers)
ou (fonctionne même s'il y a des espaces dans les noms de fichiers)
de
man grep
:la source
ls | grep -v "a file with spaces.bin" | xargs rm
. C'est lagrep
syntaxe normale .grep
maisrm
.rm
obtiendra une liste d'arguments séparés par des espaces. Essayeztouch 'a b'; touch 'c d'; ls | grep -v 'a b' | xargs rm
: vous obtiendrezrm: c: No such file or directory
etrm: d: No such file or directory
-print0
dansfind
et-0
dansxargs
. Voici une solution de contournement, mais elle est légèrement gênante.find . -maxdepth 1 -type f | grep -v 'a b' | tr '\n' '\0' | xargs -0 rm
. Au fait, gnu s'enparallel
occupe bien (je l'utilise presque toujours comme substitut de xargs:ls | grep -v 'a b' | parallel rm
-
.Conservez une copie, supprimez tout, restaurez la copie:
En une ligne:
Mais cela nécessite un shell qui supporte ici les chaînes.
la source
rm
ettar -x
.rm
peut échouer autant qu'il veut.vous pensez tous cela.
Terminé.
EDIT En fait, plus facile:
la source
Sur mon système d'exploitation Scientific Linux 6, cela fonctionne:
J'ai également installé Debian 32 bits sur une machine virtuelle. Ce qui précède ne fonctionne pas mais ce qui suit:
la source
find
solution que j'ai donnée n'a pas fonctionné?file.txt
ou quoi que ce soit d'autre?shopt
n'est pas untcsh
construit.Utiliser
rm !("file.txt")
au lieu derm !(file.txt)
la source
shopt -s extglob
. Dans tous les cas, citer un nom de fichier simple comme celui-ci n'aurait fait aucune différence.Juste pour donner une réponse différente, vous pouvez utiliser le comportement par défaut de
rm
ne pas supprimer les dossiers:la source
Je trouve que cette approche est très simple, fonctionne et ne nécessite aucune extension particulière (à ma connaissance!)
la source