Știu cum să șterg toate fișierele txt
din directorul curent de rm *.txt
. Știe cineva cum să șteargă toate fișierele din directorul curent EXCEPT txt
fișier?
Comentarii
Răspunde
Puteți utiliza find
:
find . -type f ! -name "*.txt" -delete
Sau bash „s caracteristici extinse globbing:
shopt -s extglob rm *.!(txt)
Sau în zsh:
setopt extendedglob rm *~*.txt(.) # || ^^^ Only plain files # ||^^^^^ files ending in ".txt" # | \Except # \Everything
Comentarii
- Este posibil ca unele dintre acestea să fie adaptate în funcție de dacă aveți foldere și de ceea ce doriți să faceți cu ele.
- Nu ar trebui să ' t
*.!(txt)
be!(*.txt)
? - @LauriRanta depinde de ce ' în dosar, pe care nu l-am ' nu am primit un răspuns la. ' este bine așa cum ar fi dacă toate fișierele au extensii și
rm
s-ar înăbuși dacă ar exista foldere. - Am ' am primit o problemă cu parantezele. Când folosesc stilul globbing într-un script bash, acesta se plânge de o eroare de sintaxă și de paranteze. Cu toate acestea, a face acest lucru din CLI funcționează.
- @izogfif verificați acest lucru
find . -type f ! -name "*.txt" | xargs -r rm
ar funcționa în GNU \ xargs. Este posibil ca comanda BSD și UNIX xargs să nu aibă -r trebuie să vă verificațiman xargs
local
div
Răspuns
Dacă doriți doar să ștergeți toate fișiere cu excepția „* .txt”, atunci puteți utilizați următoarea comandă:
$ find . -type f ! -name "*.txt" -exec rm -rf {} \;
dar dacă doriți și să ștergeți directoare împreună cu fișierele, puteți utiliza acest lucru:
$ find . ! -name "*.txt" -exec rm -r {} \;
Răspuns
există multe modalități de a face acest lucru. dar cel mai simplu mod ar fi (bash):
shopt -s extglob rm !(*.txt)
Comentarii
- Cum pot folosi aceasta pentru a specifica mai multe extensii?
-
shopt -s extglob
este puternic. tecmint.com/… oferă exemple bune. Pentru a șterge toate cu excepția anumitor extensii, funcționeazărm -v !(*.zip|*.odt)
.
Răspunde
Puteți utiliza grep și xargs inversate
ls | grep -v .txt$| xargs rm
Comentarii
-
ls | grep -v *.txt | xargs rm
funcționează la fel de bine - @phillipsk
grep -v *.txt
va funcționa numai dacă există ' este exact un fișier.txt
. Dacă nu există,grep
va folosi*.txt
ca model; dacă există ' mai multe, va căuta primul nume de fișier în toate celelalte fișiere.txt
, ignorând ieșirea dinls
. (Rezultatele exacte pot depinde de opțiunile glob ale shell-ului '.) -
.txt$
va potrivi șirurile care se termină cutxt
indiferent de punct. Deoarecegrep
ia expresia regulată ca parametru. Deci, fișierelea.txt
șiaatxt
șia-txt
vor fi toate potrivite cu această expresie. Expresia corectă ar trebui să fiels | grep -v \\.txt$ | xargs --no-run-if-empty rm
. Pentru curioși: dacă doriți să vă jucați cu expresia în siguranță, utilizați această expresie de testls | grep \\.txt$ | xargs --no-run-if-empty echo
(notă: nu există ' s-v
pavilion șirm=>echo
). Notă2: este posibil să fi observat o bară inversă dublă. Una este pentru regex, alta este pentru bash să scape de slash.
Răspuns
O soluție fără find
:
mv dir/*.txt otherdir/ rm -r dir mv otherdir dir
Acest lucru ar trebui să funcționeze pe tot felul de cochilii.
Răspuns
Pur și simplu faceți:
rm $(ls -I "*.txt" )
# Șterge tipul de fișier cu excepția * .txt
La fel, dacă este necesar să ștergeți „cu excepția unuia sau mai multor tipuri de fișiere”, faceți:
rm $(ls -I "*.txt" -I "*.pdf" )
#Deletes tipuri de fișiere cu excepția * .txt & * .pdf
Comentarii
- Bine ați venit la StackExchange!Opțiunea
-I
ar putea fi utilă, dar consultați de ce nu analizați ls . Și ce realizează| xargs
? Fără argumente, acesta rulează doarecho
pe toate intrările sale. - Ce se dorește să realizeze
xargs
? - Mulțumesc, xargs nu a fost util în cazul de mai sus, s-au corectat acum.
Răspuns
Acest lucru funcționează și pentru a elimina toate ascunse (punct) , cu excepția celui menționat (.mydir
):
rm -rf $(ls -aI ".mydir")
ls
înainte de a încerca efectiv să apelațirm
.