2009-11-27 16:43:23 +0000 2009-11-27 16:43:23 +0000
347
347

Hoe maak ik rm geen fout als een bestand niet bestaat?

Ik schrijf een makefile die aan het einde van de compilatie een aantal nutteloze bestanden opschoont. Als er al een doelwit is gemaakt, zal het natuurlijk dat doelwit overslaan en kan het nutteloze bestand er niet zijn. Dus als ik dit doe: rm lexer.ml interpparse.ml interpparse.mli

kan ik fouten krijgen omdat een van de bestanden niet bestaat. Is er een manier om rm te vertellen dat ze deze bestanden moeten negeren?

Bij het lezen van de man pagina zie ik de volgende optie:

-f Attempt to remove the files without prompting for confirma-
             tion, regardless of the file's permissions. If the file does
             not exist, do not display a diagnostic message or modify the
             exit status to reflect an error. The -f option overrides any
             previous -i options.

Dat klinkt als algemeen wat ik wil, maar ik ben niet echt zeker van het rechtengedeelte. Is er een manier om dit te doen?

Antwoorden (11)

296
296
296
2009-11-27 16:54:52 +0000

De -f optie is zeker wat je wilt gebruiken.

De bevestiging over bestandspermissies waar het naar verwijst is deze:

$ touch myfile    
$ chmod 400 myfile
$ rm myfile       
rm: remove write-protected regular empty file `myfile'?

Dus rm zal je waarschuwen als je een bestand probeert te verwijderen waar je geen schrijfrechten op hebt. Dit is toegestaan als je schrijfrechten hebt op de directory maar is een beetje vreemd, daarom waarschuwt rm je er normaal gesproken voor.

132
132
132
2015-03-09 12:39:25 +0000

Een andere oplossing is deze: https://stackoverflow.com/questions/11231937/bash-ignoring-error-for-a-particular-command ](https://stackoverflow.com/questions/11231937/bash-ignoring-error-for-a-particular-command)

Voeg gewoon een OR-verklaring toe na uw opdracht:

rm -rf my/dir || true

Op deze manier, wanneer verklaring #1 mislukt (gooit fout), voert u verklaring #2 uit, wat eenvoudigweg true is.

79
79
79
2012-12-23 23:12:06 +0000

Ik ben veel te laat voor het feest, maar ik gebruik dit de hele tijd. In een makefile, voeg - toe aan het begin van een lijn om de terugkeerwaarde van die lijn te negeren. Zoiets als:

-rm lexer.ml interpparse.ml interpparse.mli
14
14
14
2012-06-12 19:46:48 +0000

Als u de -f optie niet wilt gebruiken, is er een alternatief:

rm filethatdoesntexist 2> /dev/null

Dit zorgt er alleen voor dat er geen fouten worden afgedrukt.

8
8
8
2009-11-27 16:48:43 +0000

Als je een manier vindt om glob de bestandsnamen te vinden, zal rm niet klagen als het geen match kan vinden. Dus zoiets als lexer.m* interpparse.*, enz. zou voor u moeten werken (let op dat u niet te veel verwijdert, natuurlijk). Ook is -f een heel redelijke manier om te gaan, zolang je niet hoopt dat de bestandsrechten je zullen redden van het verwijderen van een bestand dat je niet wilt verwijderen - als je het niet wilt verwijderen, zet het dan niet in de lijst.

6
6
6
2009-11-27 19:27:29 +0000

De -f optie betekent dat u niet wordt gevraagd als iets niet is zoals verwacht. Het betekent niet dat er geen rekening wordt gehouden met rechten.

Als je niet genoeg rechten hebt om een bestand te verwijderen, wordt het niet verwijderd.

But , als je genoeg rechten hebt om rechten te wijzigen, wordt je bestand verwijderd. Dit is het geval wanneer je de eigenaar bent van een bestand met alleen-lezen rechten voor eigenaar (-r——–). Als eigenaar kunt u chmod u+w, dan verwijderen: rm -f zal dat bestand verwijderen.

5
5
5
2011-03-11 10:36:07 +0000

Misschien kan een gelijkaardige lijn helpen met:

touch fakefile.exe fakefile.o && rm *.o *.exe

Ik weet dat dit niet erg slim is, maar het doet het werk.

3
3
3
2015-06-11 13:55:15 +0000

Dit is wat ik gebruik in shell scripts. Het verbergt de foutmelding en de foutcode.

rm doesnotexist 2> /dev/null || echo > /dev/null
3
3
3
2009-11-27 17:44:12 +0000

Een alternatief: RmIfIsFile() { for f in "$@"; do [-f $f] && rm $f; done; }; RmIfIsFile lexer.ml interpparse.ml interpparse.mli

Jammer dat Makefiles geen schelpfunctiedefinities kunnen delen over lijnen heen.

1
1
1
2017-02-02 16:11:37 +0000

je kunt de bestanden aanraken voordat je ze rm. dat zou ze maken als ze niet bestaan :-)

touch lexer.ml interpparse.ml interpparse.mli
rm lexer.ml interpparse.ml interpparse.mli
1
1
1
2017-08-19 09:47:36 +0000

write rm -rf ppp>/dev/null 2>&1U nieuwere krijgen foutmelding Probleem treedt op, als de fout niet naar STDERR 2 maar naar STDOUT 1… Het vindt plaats als het commando geen fout genereert maar een waarschuwing. U moet een filter instellen en deze melding verwijderen. Maar dit geval is gewoon.