Hoe te controleren of een bestand bestaat in een shellscript

Ik wil graag een shellscript schrijven dat controleert of een bepaald bestand, archived_sensor_data.json, bestaat, en zo ja, verwijdert. Volg http://www.cyberciti. biz/tips/find-out-if-file-exists-with-conditional-expressions.html, ik heb het volgende geprobeerd:

[-e archived_sensor_data.json] && rm archived_sensor_data.json

Dit geeft echter een foutmelding

[-e: command not found

wanneer ik het resulterende script test_controllerprobeer uit te voeren met de opdracht ./test_controller. Wat is er mis met de code?


Antwoord 1, autoriteit 100%

Je mist een vereiste spatie tussen de haakjes en -e:

#!/bin/bash
if [ -e x.txt ]
then
    echo "ok"
else
    echo "nok"
fi

Antwoord 2, autoriteit 11%

Hier is een alternatieve methode die lsgebruikt:

(ls x.txt && echo yes) || echo no

Als je uitvoer van lswilt verbergen zodat je alleen ja of nee ziet, stuur dan stdouten stderrom naar /dev/null:

(ls x.txt >> /dev/null 2>&1 && echo yes) || echo no

Antwoord 3, autoriteit 3%

De achtergrond van mijn oplossingsaanbeveling is het verhaal van een vriend die tot ver in de tweede week van
Zijn eerste baan, veegde een halve build-server schoon. Dus de basistaak is om erachter te komen als een bestand bestaat,
En als dat het geval is, laten we het verwijderen. Maar er zijn een paar verraderlijke stroomversnellingen op deze rivier:

  • Alles is een bestand.

  • Scripts hebben alleen echt vermogen als ze algemene taken

  • oplossen

  • Om algemeen te zijn, gebruiken we variabelen

  • We gebruiken vaak -F Force in scripts om handmatige interventie

  • te voorkomen

  • en ook love -r recursief om ervoor te zorgen dat we tijdig maken, kopiëren en vernietigen.

Overweeg het volgende scenario:

We hebben het bestand dat we willen verwijderen: filesexists.json

Deze bestandsnaam wordt opgeslagen in een variabele

<host>:~/Documents/thisfolderexists filevariable="filesexists.json"

We hebben ook een padvariabele om dingen echt flexibel te maken

<host>:~/Documents/thisfolderexists pathtofile=".."
<host>:~/Documents/thisfolderexists ls $pathtofile
filesexists.json  history20170728  SE-Data-API.pem  thisfolderexists

Dus laten we eens kijken of -edoet wat het is verondersteld. Bestaan ​​de bestanden?

<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0

het doet. Magie.

Wat echter zou gebeuren, als de variabele van het bestand per ongeluk wordt geëvalueerd naar Nuffin ‘

<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0

Wat? Het wordt verondersteld terug te keren met een foutmelding … en dit is het begin van het verhaal hoe dat volledig
Map is per ongeluk verwijderd

Een alternatief kan zijn om specifiek te testen voor wat we begrijpen als een ‘bestand’

<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
0

Dus het bestand bestaat …

<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
1

Dus dit is geen bestand en misschien willen we die volledige directory

niet verwijderen

man testHeeft het volgende om te zeggen:

-b FILE
       FILE exists and is block special
-c FILE
       FILE exists and is character special
-d FILE
       FILE exists and is a directory
-e FILE
       FILE exists
-f FILE
       FILE exists and is a regular file
...
-h FILE
       FILE exists and is a symbolic link (same as -L)

Antwoord 4, Autoriteit 2%

Intern, moet de RM-opdracht toch testen voor bestandsbestand,
Dus waarom een ​​andere test toevoegen? Gewoon uitgave

rm filename

en het zal daarna weg zijn, of het nu was of niet.
Gebruik RM -F Is u geen berichten over niet-bestaande bestanden.

Als u een actie moet ondernemen als het bestand niet bestaat, moet u voor uzelf testen. Op basis van uw voorbeeldcode is dit in dit geval niet het geval.


Antwoord 5

Als je een NFS gebruikt, is “test” een betere oplossing, omdat je er een time-out aan kunt toevoegen voor het geval je NFS niet werkt:

time timeout 3 test -f 
/nfs/my_nfs_is_currently_down
real    0m3.004s <<== timeout is taken into account
user    0m0.001s
sys     0m0.004s
echo $?
124   <= 124 means the timeout has been reached

Een “[ -e my_file ]” constructie zal bevriezen totdat de NFS weer functioneel is:

if [ -e /nfs/my_nfs_is_currently_down ]; then echo "ok" else echo "ko" ; fi
<no answer from the system, my session is "frozen">

Antwoord 6

U kunt ook stat:

. gebruiken

stat /
  File: /
  Size: 4096            Blocks: 8          IO Block: 4096   directory
Device: fd01h/64769d    Inode: 2           Links: 26
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2009-01-01 02:00:00.000000000 +0200
Modify: 2009-01-01 02:00:00.000000000 +0200
Change: 2009-01-01 02:00:00.000000000 +0200
 Birth: -

Op een pad dat niet bestaat, krijg je:

stat /aaa
stat: cannot stat '/aaa': No such file or directory

Other episodes