[Linux/Unix] rm -R *.bak

Pagina: 1
Acties:

  • erikafoort
  • Registratie: December 2006
  • Niet online
Hallo,

klein obstakel, ik probeer met rm -R *.bak een aantal bak bestanden in de subdirectory te verwijderen ( bak is een backup file die naast het originele bestand bestaat en mogen aan het einde van de dag weg voordat de backup gemaakt wordt. Ik dacht dan ook met de optie -R ( recursive ) ook in subdirectories te kijken en zodoende ook de bestanden daar te verwijderen maar dat lukt dus niet. Alleen de bestanden in de current directory worden verwijderd.

Op mijn mac ( ook Unix dus ) krijg ik precies hetzelfde resultaat als op de computer waar het op moet gebeuren. ( een SuSe distro met bash als shell )

Ik heb allerlei combinaties geprobeerd waaronder het commando ls, opties als -Rf etc etc. Ook op Google kom ik eigenlijk niet veel verder. Volgens mij moet ik echt wat simpels over het hoofd zien dat dit niet werkt.

  • DiedX
  • Registratie: December 2000
  • Laatst online: 07:18
probeer eens -r

DiedX supports the Roland™, Sound Blaster™ and Ad Lib™ sound cards


  • matinez
  • Registratie: Augustus 2003
  • Niet online
#su
#rm -R -f *.bak

Verwijderd

find . -type f -name "*.bak" -exec rm -vf '{}' \;


De opmerkingen hierboven geven wel weer aan dat veel mensen niet even nadenken over hoe *.bak geëxpand wordt door de shell. Dat is killing als je met recursieve rm operaties aan de gang gaat. Heel verstandig ook om dat even als superuser te gaan proberen. Denk even na zeg. Een recursieve operatie op *.bak zou alle bestanden die *.bak heten verwijderen, en ook alle directories die *.bak heten met hun volledige inhoud verwijderen (wat die inhoud ook moge zijn).

In mijn voorbeeld zou je eerst doen:
find . -type f -name "*.bak"


Dan zie je vanzelf alle bestanden zien. Als je hebt geverifieerd dat alles weg mag, voeg je de -exec en de rest toe. Als je dit soort dingen liever niet eerst even "test": veel plezier met het slopen van je Linux machine.

[ Voor 87% gewijzigd door Verwijderd op 24-07-2008 23:22 ]


  • erikafoort
  • Registratie: December 2006
  • Niet online
inderdaad had ik diverse probeersels even met ls geprobeerd in eerste instantie en natuurlijk niet als root. In dit geval had ik niet veel uitgemaakt als de directories eindigend op .bak ook weg zouden worden gegooid maar ik kan me voorstellen wat het doet :-)

ben even aan het testen, zo terug.

edit @cheatah, toppie werkt helemaal !! bedankt

edit2; maar waarom werkte rm -R *.bak dan niet ? ( ook al is het niet verstandig ). al dan niet met hoofdletter R/r of de optie -f ( force )

[ Voor 24% gewijzigd door erikafoort op 24-07-2008 23:45 ]


  • DiedX
  • Registratie: December 2000
  • Laatst online: 07:18
Ik ben het met cheetah eens overigens. Zelf nooit de fout gemaakt om te rm -rf'en, maar je speelt altijd wel met vuur. De find-methode is veiliger. (ooit wel eens een chown www-data -R gedaan, vanuit de root, dan kan je ook naar je tapes grijpen ;)

het is rm -r(f). Het is dan wel weer chown -R, or een ander commando wat recursief gedaan moet worden. Bij twijfel: man rm :)

DiedX supports the Roland™, Sound Blaster™ and Ad Lib™ sound cards


Verwijderd

* zal nooit expanden naar iets met een slash erin. Het kan expanden naar maximaal één component uit een path. Een directory test.bak zal dus *.bak matchen, maar test/file.bak niet.

De -f flag heeft gevolgen voor wat er gedaan wordt met alle gematchte componenten. De directory test.bak zal dus verwijderd worden als de -r flag is geset. Alles wat in die directory staat wordt dus verwijderd, of dat nu .bak bestanden zijn of niet.

  • zomertje
  • Registratie: Januari 2000
  • Laatst online: 22-01 20:37

zomertje

Barisax knorretje

Ik heb ooit met een 'ff snel typen actie' per ongeluk een spatie gezet tussen de * en de .bak (of watever daar toen stond) en dan heb je bij rm -rf wel een probleem :) Gelukkig had ik daar geen rechten om ook echt goed te slopen.

Een echte rm -rf /* zorgt ervoor dat je systeem binnen een paar minuten dan ook echt helemaal niks meer doet :+

De find is een goeie oplossing, -R werkt niet. Deze zoekt naar dirs met een .bak extensie om die dan met inhoud te verwijderen. En dat is niet wat je wil.

het ultieme jaargetijde.... | #!/usr/bin/girl | Art prints and fun


  • sparks
  • Registratie: December 2002
  • Laatst online: 08:33
Wilde een opmerking maken over de dubbele quotes, maar dat gaat wel goed. Gebruik zelf altijd liever enkele quotes maar dat is in dit geval niet nodig.

[ Voor 68% gewijzigd door sparks op 25-07-2008 16:17 ]


  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 28-01 16:23

deadinspace

The what goes where now?

sparks schreef op vrijdag 25 juli 2008 @ 16:07:
Wilde een opmerking maken over de dubbele quotes, maar dat gaat wel goed. Gebruik zelf altijd liever enkele quotes maar dat is in dit geval niet nodig.
Nee hoor:
% ls
index.html  index.html.bak  style.css  style.css.bak
% echo "*.bak"
*.bak


edit:
Te laat, sparks >:)

[ Voor 21% gewijzigd door deadinspace op 25-07-2008 17:02 ]


Verwijderd

Find met xargs is naar mijn mening de mooiste oplossing omdat xargs een stuk sneller is dan -exec :)

find . -type f -name "*.bak" -print0 | xargs -0 rm -rf

Verwijderd

Verwijderd schreef op vrijdag 25 juli 2008 @ 16:58:
Find met xargs is naar mijn mening de mooiste oplossing omdat xargs een stuk sneller is dan -exec :)

find . -type f -name "*.bak" -print0 | xargs -0 rm -rf
Jammer dat je dan toch de fout maakt die -r flag daar te zetten ;) De -type f is natuurlijk voldoende om dat af te vangen, maar toch... :P

Verwijderd

Het bekende typ foutje. Het moet natuurlijk dit zijn:

find . -type f -name "*.bak" -print0 | xargs -0 rm -f

Verwijderd

erikafoort schreef op donderdag 24 juli 2008 @ 23:38:
edit2; maar waarom werkte rm -R *.bak dan niet ? ( ook al is het niet verstandig ). al dan niet met hoofdletter R/r of de optie -f ( force )
Dat komt door filename completion. Als je een commando op geeft, doet de shell eerst nog wat dingetjes voordat ie het laat uitvoeren waaronder filename completion. Stel je hebt file1.bak en file2.bak in een dir staan. Als je dan het commando rm -R *.bak opgeeft, dan doet de shell de filename completion nog voordat hij de instructies aan het commando rm doorgeeft. De shell kijkt in de huidige dir, ziet de 2 .bak files staan en verandert het commando in "rm -R file1.bak file2.bak". Dit geeft ie door aan rm, en rm verwijdert alleen deze bestanden, en niet de *.bak files in de subdirs.

  • Rainmaker
  • Registratie: Augustus 2000
  • Laatst online: 14-07-2024

Rainmaker

RHCDS

3.5.8 Filename Expansion
After word splitting, unless the -f option has been set (see section 4.3 The Set Builtin), Bash scans each word for the characters ‘*’, ‘?’, and ‘[’. If one of these characters appears, then the word is regarded as a pattern, and replaced with an alphabetically sorted list of file names matching the pattern.
Van http://www.network-theory...ef/FilenameExpansion.html

Oftewel: bash probeert slim te zijn door de *.bak op je commandline te vervangen door de filename van alle bestanden in de huidige directory die aan dit patroon voldoen.

offtopic:
Oeps, moet verder omlaag scrollen.

[ Voor 3% gewijzigd door Rainmaker op 28-07-2008 09:17 ]

We are pentium of borg. Division is futile. You will be approximated.


  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Verwijderd schreef op vrijdag 25 juli 2008 @ 18:40:
[...]

Jammer dat je dan toch de fout maakt die -r flag daar te zetten ;) De -type f is natuurlijk voldoende om dat af te vangen, maar toch... :P
Maakt in dit geval niet uit omdat find -type f toch alleen files teruggeeft. Maar mensen moeten idd wel afleren om 'rm -rf' niet als het standaard commando te zien ipv gewoon 'rm'.

All my posts are provided as-is. They come with NO WARRANTY at all.


Verwijderd

Rainmaker schreef op maandag 28 juli 2008 @ 09:16:
Oftewel: bash probeert slim te zijn door de *.bak op je commandline te vervangen door de filename van alle bestanden in de huidige directory die aan dit patroon voldoen.
Bash moet wel, want rm doet niets met wildcards. :-)
code:
1
2
3
4
peter@iris:~/tmp$ ls
blaat  blaat.bak  file1  file1.bak  file2  file2.bak
peter@iris:~/tmp$ rm -r \*.bak
rm: cannot remove `*.bak': No such file or directory

  • daft_dutch
  • Registratie: December 2003
  • Laatst online: 02-12-2025

daft_dutch

>.< >.< >.< >.<

zomertje schreef op vrijdag 25 juli 2008 @ 09:01:
Een echte rm -rf /* zorgt ervoor dat je systeem binnen een paar minuten dan ook echt helemaal niks meer doet :+
hij stopt toch nadat rm is verwijdert?

>.< >.< >.< >.<


  • Arioch
  • Registratie: Maart 2002
  • Laatst online: 23-01 11:53

Arioch

<geek>

Iets in deze stijl?
code:
1
for i in `ls | grep .bak`; do echo $i; rm -rf $i; done

Verwijderd

Arioch schreef op maandag 28 juli 2008 @ 21:21:
Iets in deze stijl?
code:
1
for i in `ls | grep .bak`; do echo $i; rm -rf $i; done
You're fired. om meer redenen dan 1.
Doe even je best om aan te wijzen waar je zelf cruciale fouten maakt.

Zo moeilijk is het allemaal écht niet. Maar ga anderen nou niet slechte gewoonten aanleren. Ik zal er al één verklappen die niet zo voor de hand ligt:
$ echo `ls /bin/rm`
/bin/rm
$ alias ls='ls -F'
$ echo `ls /bin/rm`
/bin/rm*
/bin/rmdir*

Het gebruiken van ls binnen scripts kan behoorlijk gevaarlijk zijn!

Andere fouten zijn natuurlijk het niet escapen van $i, het gebruik van de -r flag als je alleen bestanden wilt verwijderen.

[ Voor 42% gewijzigd door Verwijderd op 28-07-2008 21:38 ]


  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 28-01 16:23

deadinspace

The what goes where now?

daft_dutch schreef op maandag 28 juli 2008 @ 20:52:
hij stopt toch nadat rm is verwijdert?
Nee hoor. Als rm eenmaal is gestart, dan dendert hij vrolijk verder. Probeer maar uit ;)

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

daft_dutch schreef op maandag 28 juli 2008 @ 20:52:
[...]

hij stopt toch nadat rm is verwijdert?
Probeer maar :) De laatste keer dat ik 't (opzettelijk ;)) deed niet. De binary is memory mapped, en de file wordt pas echt verwijderd als het aantal open handles verlaagd is naar nul. Zolang rm aan het uitvoeren is, wordt het dus nog even niet verwijderd. Dito voor de so's die rm gebruikt.

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 13:20
daft_dutch schreef op maandag 28 juli 2008 @ 20:52:
[...]

hij stopt toch nadat rm is verwijdert?
U gaat niet door voor de koelkast. ;)

Als je Firefox draait en je gooit de Firefox binary weg, dan stopt het programma er ook niet mee. Het programma wordt namelijk in het geheugen geladen. Dit is nodig omdat programma's alleen vanuit het geheugen kan draaien en niet van harde schijf. :)

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Het programma wordt niet eens helemaal in het geheugen geladen, maar gemapped, en wanneer nodig worden de pages van disk gelezen. De reden dat het programma dan niet stopt is omdat de use count (oid, ben even de term kwijt) nog niet naar nul is en de kernel het bestand dus nog niet echt verwijdert. Het is wel al niet meer zichtbaar in directory listings ed.

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Vicarious
  • Registratie: Juni 2008
  • Laatst online: 24-06-2024

Vicarious

☑Rekt | ☐ Not rekt

Wat een ingewikkeld gedoe om een paar .bak bestandjes weg te gooien zeg :o

Vicariously I live while the whole world dies

Pagina: 1