Ș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
rms-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 rmar funcționa în GNU \ xargs. Este posibil ca comanda BSD și UNIX xargs să nu aibă -r trebuie să vă verificațiman xargslocal
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 extglobeste 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 rmfuncționează la fel de bine - @phillipsk
grep -v *.txtva funcționa numai dacă există ' este exact un fișier.txt. Dacă nu există,grepva folosi*.txtca 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ă cutxtindiferent de punct. Deoarecegrepia expresia regulată ca parametru. Deci, fișierelea.txtșiaatxtșia-txtvor 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-vpavilion ș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
-Iar putea fi utilă, dar consultați de ce nu analizați ls . Și ce realizează| xargs? Fără argumente, acesta rulează doarechope 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.