Kaip sužinoti, ar yra įprastas failas „bash“?

Šį scenarijų naudoju, kad pamatytumėte, ar failas egzistuoja:

 #!/bin/bash FILE=$1 if [ -f $FILE ]; then echo "File $FILE exists." else echo "File $FILE does not exist." fi 

Kas yra tinkama sintaksė, jei noriu patikrinti, ar failas neegzistuoja?

 #!/bin/bash FILE=$1 if [ $FILE does not exist ]; then echo "File $FILE does not exist." fi 
2142
12 марта '09 в 17:48 2009-03-12 17:48 Billas „Lizard“ yra nustatytas kovo 12 d., 09:17, 17:48 2009-03-12 17:48
@ 17 atsakymų

Bandymo komanda ( [ čia] turi ne loginį operatorių, kuris yra šauktukas (kaip ir daugelis kitų kalbų). Pabandykite atlikti šiuos veiksmus:

 if [ ! -f /tmp/foo.txt ]; then echo "File not found!" fi 
3020
12 марта '09 в 17:50 2009-03-12 17:50 atsakymą pateikė John Feminella kovo 12 d., 09:17 , 2009-03-12 17:50

„Bash File Testing“

-b filename - blokuoti specialų failą
-c filename - specialus simbolių failas
-d directoryname - patikrinkite katalogo buvimą
-e filename - patikrinkite failo prieinamumą, nepriklausomai nuo tipo (mazgas, katalogas, lizdas ir kt.)
-f filename - patikrinkite, ar yra įprastas failas, o ne katalogas.
-G filename - patikrinkite, ar failas egzistuoja ir ar jis priklauso efektyviam grupės identifikatoriui.

-G filename set-group-id - Tiesa, jei failas yra ir yra nustatytas kaip set-group-id
-k filename - Sticky Bit
-L filename - simbolinė nuoroda
-O filename - tiesa, jei failas egzistuoja ir priklauso efektyviam naudotojo ID.
-r filename - patikrinkite, ar failas yra įskaitomas. -S filename - patikrinkite, ar failas yra lizdas -S filename - patikrinkite, ar failas yra nulinio dydžio
-u filename - Patikrinkite, ar rinkmenos rinkmenos rinkinys set-user-id -w filename yra nustatytas - patikrinkite, ar failas yra rašomas
-x filename - patikrinkite, ar failas yra vykdomas

Kaip naudoti:

border=0
 #!/bin/bash file=./file if [ -e "$file" ]; then echo "File exists" else echo "File does not exist" fi 

Bandymo išraiška gali būti atmesta naudojant operatorių !

 #!/bin/bash file=./file if [ ! -e "$file" ]; then echo "File does not exist" else echo "File exists" fi 
278
16 янв. Atsakymas duotas GroundZero 16 sausis 2014-01-16 17:25 '14, 17:25 2014-01-16 17:25

Galite atšaukti išraišką „!“:

 #!/bin/bash FILE=$1 if [ ! -f "$FILE" ] then echo "File $FILE does not exist" fi 

Atitinkamas man test puslapis yra man test arba lygiaverčiai man [ - arba help test arba help [ bash įmontuotai komandai.

238
12 марта '09 в 17:50 2009-03-12 17:50 atsakymas pateikiamas nepripažįstamas kovo 12 d., 17:50, 2009-03-12 17:50
 [[ -f $FILE ]] || printf '%s does not exist!\n' "$FILE" 

Be to, yra įmanoma, kad failas yra sugadintas simbolinis ryšys arba netinkamas failas, pavyzdžiui, pavyzdžiui. lizdas, įrenginys arba FIFO. Pavyzdžiui, jei norite pridėti pažeistų simbolinių nuorodų čekį:

 if [[ ! -f $FILE ]]; then if [[ -L $FILE ]]; then printf '%s is a broken symlink!\n' "$FILE" else printf '%s does not exist!\n' "$FILE" fi fi 
100
12 марта '09 в 17:52 2009-03-12 17:52 atsakymas duotas ginklams Kovo 12 '09, 17:52 2009-03-12 17:52

Verta pažymėti, kad jei reikia atlikti vieną komandą, galite sumažinti

 if [ ! -f "$file" ]; then echo "$file" fi 

į

 test -f "$file" || echo "$file" 

arba

 [ -f "$file" ] || echo "$file" 
71
11 авг. atsakymą pateikė Elazar Leibovich 11 rug. 2011-08-11 12:15 '11, 12:15, 2011-08-11 12:15

Norėčiau daryti tokį vieno linijos POSIX šrifto formatą, suderinamą su korpusu:

 $ [ -f "/$DIR/$FILE" ] || echo "$FILE NOT FOUND" $ [ -f "/$DIR/$FILE" ]  echo "$FILE FOUND" 

Keletas komandų, kaip darau scenarijuje:

 $ [ -f "/$DIR/$FILE" ] || { echo "$FILE NOT FOUND" ; exit 1 ;} 

Kai pradėjau tai padaryti, retai naudoju visiškai įvestą sintaksę!

52
18 окт. Atsakyti TechZilla Oct 18. 2011-10-18 19:09 '11, 19:09, 2011-10-18 19:09

Jei norite patikrinti failo buvimą, parametras gali būti bet kuris iš šių būdų:

 -e: Returns true if file exists (regular file, directory, or symlink) -f: Returns true if file exists and is a regular file -d: Returns true if file exists and is a directory -h: Returns true if file exists and is a symlink 

Visi šie testai taikomi įprastiems failams, katalogams ir simbolinėms nuorodoms:

 -r: Returns true if file exists and is readable -w: Returns true if file exists and is writable -x: Returns true if file exists and is executable -s: Returns true if file exists and has a size > 0 

Scenarijaus pavyzdys:

 #!/bin/bash FILE=$1 if [ -f "$FILE" ]; then echo "File $FILE exists" else echo "File $FILE does not exist" fi 
32
Atsakymas yra SD. 19 gr 2013-12-19 15:47 '13, 15:47 2013-12-19 15:47

Turite būti atsargūs vykdant nekotiruoto kintamojo test , nes tai gali sukelti netikėtų rezultatų:

 $ [ -f ] $ echo $? 0 $ [ -f "" ] $ echo $? 1 

Paprastai rekomenduojama, kad bandomasis kintamasis būtų apsuptas dvigubomis kabutėmis:

 #!/bin/sh FILE=$1 if [ ! -f "$FILE" ] then echo "File $FILE does not exist." fi 
27
24 янв. Atsakymą pateikė Artdanil Jan 24 2012-01-24 22:43 '12 10:43 val. 2012-01-24 22:43

Yra trys skirtingi būdai:

  • Atšaukti išėjimo būseną su bash (jokio kito atsakymo nepateikta):

     if ! [ -e "$file" ]; then echo "file does not exist" fi 

    Arba:

     ! [ -e "$file" ]  echo "file does not exist" 
  • Atšaukite bandymą bandymo komandoje [ (taip, kaip dauguma atsakymų buvo pateikti anksčiau):

     if [ ! -e "$file" ]; then echo "file does not exist" fi 

    Arba:

     [ ! -e "$file" ]  echo "file does not exist" 
  • Pareiškimas, kad bandymo rezultatas yra neigiamas ( || vietoj > ):

    tik

     [ -e "$file" ] || echo "file does not exist" 

    Jis atrodo kvailas (TJO), nenaudokite jo, jei jūsų kodas neturėtų būti perkeltas į „Bourne“ korpusą (pvz., /bin/sh Solaris 10 ar anksčiau), kuris neturėjo konvejerio atsisakymo operatoriaus ( ! ):

     if [ -e "$file" ]; then : else echo "file does not exist" fi 
17
05 авг. atsakymą pateikė user2350426 05 rug . 2015-08-05 21:10 '15 , 21:10 2015-08-05 21:10

Jei norite atšaukti testą, naudokite „!“. Tai atitinka „ne“ loginį operatorių kitomis kalbomis. Pabandykite atlikti šiuos veiksmus:

 if [ ! -f /tmp/foo.txt ]; then echo "File not found!" fi 

Arba parašyta šiek tiek kitaip:

 if [ ! -f /tmp/foo.txt ] then echo "File not found!" fi 

Arba galite naudoti:

 if ! [ -f /tmp/foo.txt ] then echo "File not found!" fi 

Arba visi kartu:

 if ! [ -f /tmp/foo.txt ]; then echo "File not found!"; fi 

Ką galima parašyti (naudojant operatorių ir „: kaip:

 [ ! -f /tmp/foo.txt ]  echo "File not found!" 

Kuris atrodo trumpesnis:

 [ -f /tmp/foo.txt ] || echo "File not found!" 
7
05 мая '13 в 1:29 2013-05-05 01:29 atsakymą pateikė vartotojo2350426 05 gegužės 13 d. 1:29 2013-05-05 01:29

Šis kodas taip pat veikia.

 #!/bin/bash FILE=$1 if [ -f $FILE ]; then echo "File '$FILE' Exists" else echo "The File '$FILE' Does Not Exist" fi 
7
03 июля '15 в 11:39 2015-07-03 11:39 atsakymą pateikė Lemon Kazi liepos 15 d. 15 val. 11:39 2015-07-03 11:39

Dalyko test gali būti skaičiuojamas. Jis dirbo man (remiantis „ Bash Shell“: patikrinkite, ar nėra failo, ar ne ):

 test -e FILENAME  echo "File exists" || echo "File doesn't exist" 
7
31 марта '13 в 16:22 2013-03-31 16:22 atsakymą davė „ Android“ kūrėjas kovo 31 d. 13 val. 16:22 2013-03-31 16:22

Į

 [ -f "$file" ] 

[ Komanda atlieka stat() sistemos skambutį (o ne lstat() ) $file išsaugotame maršrute ir grąžina teisingumą, jei sėkmingai lstat() šis sistemos skambutis, ir stat() grąžintas failo tipas yra „stabilus“.

Taigi, jei [ -f "$file" ] grąžina teisingumą, galite pasakyti, kad failas egzistuoja ir yra įprastas failas arba simbolinė nuoroda, kuri galiausiai išsprendžia įprastą failą (arba bent jau buvo stat() ) .

Tačiau, jei jis grąžina klaidingą (arba jei [ ! -f "$file" ] arba ! [ -f "$file" ] grįžta teisingai), yra daug įvairių galimybių:

  • failo nėra
  • failas yra, bet nėra įprastas failas
  • failas egzistuoja, bet neturite leidimo ieškoti pagrindinio katalogo
  • failas egzistuoja, tačiau šis kelias yra per ilgas
  • Failas yra simbolinė nuoroda į įprastą failą, tačiau neturite leidimo ieškoti kai kurių katalogų, susijusių su simbolinės nuorodos sprendimu.
  • ... bet kokia kita priežastis, kodėl stat() sistema gali skambėti.

Trumpai tariant, tai turėtų būti:

 if [ -f "$file" ]; then printf '"%s" is a path to a regular file or symlink to regular file\n' "$file" elif [ -e "$file" ]; then printf '"%s" exists but is not a regular file\n' "$file" elif [ -L "$file" ]; then printf '"%s" exists, is a symlink but I cannot tell if it eventually resolves to an actual file, regular or not\n' "$file" else printf 'I cannot tell if "%s" exists, let alone whether it is a regular file or not\n' "$file" fi 

Norėdami žinoti, kad failas neegzistuoja, reikia stat() sistemos skambučio, kad sugrįžtume su klaidos kodu ENOENT ( ENOTDIR sako, kad vienas iš kelio komponentų nėra katalogas, tai dar vienas atvejis, kai galime pasakyti, kad failo nėra taip). Deja, komanda [ nepraneša apie tai. Jis sugrąžins klaidą, ar klaidos kodas yra ENOENT, EACCESS (neleidžiamas leidimas), ENAMETOOLONG ar kažkas kita.

[ -e "$file" ] testą taip pat galima atlikti naudojant ls -Ld -- "$file" > /dev/null . Tokiu atveju ls jums pasakys, kodėl stat() nepavyksta, nors informacija negali būti lengvai naudojama programiniu būdu:

 $ file=/var/spool/cron/crontabs/root $ if [ ! -e "$file" ]; then echo does not exist; fi does not exist $ if ! ls -Ld -- "$file" > /dev/null; then echo stat failed; fi ls: cannot access '/var/spool/cron/crontabs/root': Permission denied stat failed 

Bent jau aš tai pasakysiu ne todėl, kad failas neegzistuoja. Taip yra todėl, kad ji negali nustatyti, ar failas egzistuoja. Komanda [ tiesiog ignoravo problemą.

Naudodami zsh apvalkalą, galite paklausti klaidos kodo naudodami specialų $ERRNO kintamąjį po komandos [ ir dekoduoti šį numerį naudodami specialią $errnos zsh/system modulyje:

 zmodload zsh/system ERRNO=0 if [ ! -f "$file" ]; then err=$ERRNO case $errnos[err] in ("") echo exists, not a regular file;; (ENOENT|ENOTDIR) if [ -L "$file" ]; then echo broken link else echo does not exist fi;; (*) echo "can't tell"; syserror "$err" esac fi 

(Saugokitės „ $errnos palaikymo kai kuriose „ zsh versijose, kai $errnos naujausias „ gcc versijas ).

7
14 окт. atsakymas, kurį pateikė Stephane Chazelas spalio 14 d 2016-10-14 18:18 '16 at 18:18 2016-10-14 18:18

Galite naudoti bash specifinį:

 [[ ! -f "$FILE" ]]  echo "File doesn't exist" 

arba

 if [[ ! -f "$FILE" ]]; then echo "File doesn't exist" fi 

Jei norite patikrinti failą ir aplanką abiem, naudokite -e parinktį vietoj -f .

6
28 апр. Atsakymą pateikė Jahid 28 Bal 2015-04-28 22:40 '15, 10:40 pm 2015-04-28 22:40

Lengviausias būdas

 FILE=$1 [ ! -e "${FILE}" ]  echo "does not exist" || echo "exists" 
4
21 мая '14 в 9:11 2014-05-21 09:11 atsakymas pateikiamas lancerex gegužės 21 d., 14 val. 9:11 2014-05-21 09:11

Šis scenarijų įvynioklis taip pat padeda rasti failą kataloge:

 echo "enter file" read -ra if [ -s /home/trainee02/"$a" ] then echo "yes. file is there." else echo "sorry. file is not there." fi 
2
29 авг. Atsakymą Simmant pateikė rugpjūčio 29 d. 2013-08-29 09:59 '13, 9:59, 2013-08-29 09:59

kartais patogu naudoti ir || operatoriams.

Kaip ir (jei turite „bandymo“ komandą):

 test -b $FILE  echo File not there! 

arba

 test -b $FILE || echo File there! 
0
11 апр. Atsakymas duotas André 11 balandžio. 2017-04-11 23:25 '17 at 11:25 pm 2017-04-11 23:25

Kiti klausimai apie žymių arba „ Užduoti klausimą“