Başda müntəzəm bir fayl varmı?

Faylın olub olmadığını görmek üçün aşağıdakı scripti istifadə etdim:

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

Yalnızca fayl mövcud olmadığını yoxlamaq istəsəniz istifadə etmək üçün doğru sözdizim nədir?

 #!/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 Bill Kərtənkət 12 mart 2009-cu il saat 17: 00-da təyin olunub
@ 17 cavab

Test komutu (burada) bir natamam işarəsi olan bir qeyri-məntiqli operatora malikdir (bir çox başqa dillər kimi). Aşağıdakıları cəhd edin:

 if [ ! -f /tmp/foo.txt ]; then echo "File not found!" fi 
3020
12 марта '09 в 17:50 2009-03-12 17:50 cavab 12 mart 09: 00-da John Feminella tərəfindən verilir. 2009-03-12 17:50

Bash Fayl Testi

-b filename - xüsusi faylları bloklayın
-c filename - xüsusi xarakterli fayl
-d directoryname - kataloq mövcudluğunu yoxlayın
-e filename - -e filename tipindən asılı olmayaraq (node, directory, socket, və s.) fayl mövcudluğunu yoxlayın.
-f filename - Bir qovluq deyil, müntəzəm bir fayl varlığını yoxlayın.
-G filename - Faylın mövcud olub olmadığını və effektiv qrup identifikatoruna -G filename yoxlayın.

-G filename set-group-id - Fayl mövcud olduqda və set-qrup-id kimi müəyyən edilir
-k filename - Sabit Bit
-L filename - Simvolik link
-O filename - Fayl mövcud olduqda və effektiv istifadəçi kimliyinə aiddir.
-r filename - Faylın oxunaqlı olub olmadığını yoxlayın. -S filename - Faylın socket -S filename yoxlayın - Faylın qeyri-sıfır
-u filename - Fayl bit set-user-id -w filename müəyyən olub-olmadığını yoxlayın - Faylın yazılabilir olub olmadığını yoxlayın
-x filename - faylın icra edilə -x filename yoxlayın

Necə istifadə olunur:

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

Test ifadəsi operatordan istifadə edərək rədd edilə bilər !

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

İfadəni "!" İlə ləğv edə bilərsiniz:

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

Müvafiq man test səhifəsi man test və ya bərabərdir, man [ - ya da help test və ya help [ bash daxili komanda üçün.

238
12 марта '09 в 17:50 2009-03-12 17:50 cavab 12 mart 2009-cu il saat 17: 05-da elan edilməyəcək
 [[ -f $FILE ]] || printf '%s does not exist!\n' "$FILE" 

Bundan əlavə, faylın qırılmış simvolik bir link və ya qeyri-müntəzəm bir fayl, məsələn, mümkündür. socket, cihaz və ya fifo. Məsələn, broken simvolik bağlantılar üçün bir çek əlavə etmək üçün:

 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 cavab 12 mart 2009-cu il saat 17: 52-da verilir

Bir əmri yerinə yetirməli olmağınız lazımdırsa, azaldın

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

üçün

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

və ya

 [ -f "$file" ] || echo "$file" 
71
11 авг. Cavab Elazar Leiboviç 11 avqustda verilir. 2011-08-11 12:15 '11 'da 12:15' de 2011-08-11 12:15

Qəbilə ilə uyğun gələn birdəfəlik POSIX font formatını etmək üçün üstünlük verirəm:

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

Bir neçə komanda üçün, skriptdə olduğu kimi:

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

Bunu etməyə başladığımda, nadir hallarda artıq tam yazılmış sözdizimdən istifadə edirəm!

52
18 окт. Cavab TechZilla 18 oktyabr. 2011-10-18 19:09 '11 at 19:09 2011-10-18 19:09

Bir faylın varlığını yoxlamaq üçün parametr aşağıdakılardan hər hansı biri ola bilər:

 -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 

Bütün aşağıdakı testlər müntəzəm fayllar, kataloqlar və simvolik əlaqələr üçün tətbiq olunur:

 -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 

Nümunə skripti:

 #!/bin/bash FILE=$1 if [ -f "$FILE" ]; then echo "File $FILE exists" else echo "File $FILE does not exist" fi 
32
Cavab SD- dir . Dec 19 2013-12-19 15:47 '13 saat 15:47 'də 2013-12-19 15:47

Beklenmeyen nəticələrə gətirib çıxara bilməsi üçün, qeyd edilməyən dəyişən üçün test çalışması zamanı diqqətli olmalısınız:

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

Ümumiyyətlə, test dəyişəninin cüt tirajla çevrildiyi məsləhət olunur:

 #!/bin/sh FILE=$1 if [ ! -f "$FILE" ] then echo "File $FILE does not exist." fi 
27
24 янв. Cavab 24 yanvar artdanil tərəfindən verilir 2012-01-24 22:43 '12 at 10:43 pm 2012-01-24 22:43

Bunu etmək üçün üç müxtəlif yol var:

  • Bash ilə çıxış statusunu ləğv et (başqa bir cavab belə deyildi):

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

    Və ya:

     ! [ -e "$file" ]  echo "file does not exist" 
  • Testi test əmrinin içərisində ləğv edin [ (cavabların əksəriyyəti əvvəl verilmişdir):

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

    Və ya:

     [ ! -e "$file" ]  echo "file does not exist" 
  • Test nəticəsinin mənfi ( > əvəzinə || ) ifadəsi:

    yalnız

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

    Şifrəniz (IMO) görünür, kodunuz Bourne qabığına (məsələn, /bin/sh Solaris 10 və ya daha əvvəl) portativ olmadıqda, onu istifadə etmədi ki, bu da bir konveyer inkarçı operatoru olmadı ( ! ):

     if [ -e "$file" ]; then : else echo "file does not exist" fi 
17
05 авг. cavab user2350426 05 Aug tərəfindən verilir . 2015-08-05 21:10 '15 at 21:10 2015-08-05 21:10

Bir testi ləğv etmək üçün "!" İstifadə edin. Bu digər dillərdə "qeyri" məntiqi operatora bərabərdir. Aşağıdakıları cəhd edin:

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

Yoxsa bir az fərqli yazılmışdır:

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

Və ya istifadə edə bilərsiniz:

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

Və ya hamısı birlikdə:

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

Nə yazıla bilər ("və" operatoru istifadə edərək):

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

Hansı daha qısa görünür:

 [ -f /tmp/foo.txt ] || echo "File not found!" 
7
05 мая '13 в 1:29 2013-05-05 01:29 cavab 05.05.13 tarixində 1:29 2013-05-05 01:29 istifadəçi tərəfindən verilir

Bu kod da işləyir.

 #!/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 Cavab Lemon Kazi tərəfindən 03 iyul 'da saat 11:39' də verilir 2015-07-03 11:39

Şey test sayılır. Mənim üçün çalışdı ( Bash Shell əsasında : Fayl mövcudluğunu yoxlayın ).

 test -e FILENAME  echo "File exists" || echo "File doesn't exist" 
7
31 марта '13 в 16:22 2013-03-31 16:22 cavab Android developer tərəfindən verilir 31 Mart 'da 16:22' da 2013-03-31 16:22

Daxildir

 [ -f "$file" ] 

[ Əmr, $file saxlanılan yolda stat() sistem çağırışını ( lstat() ) yerinə yetirir və bu sistem zəng lstat()stat() tərəfindən qaytarılan fayl növü "Stabil" dir.

Beləliklə, [ -f "$file" ] doğru olduqda, faylın mövcud olduğunu və müntəzəm olaraq müntəzəm bir faylın (ya da ən azı stat() zamanı olduğu stat() həll edən müntəzəm bir fayl və ya simvolik bir keçid olduğunu söyləyə bilərsiniz .

Fəqət (və ya [ ! -f "$file" ] və ya ! [ -f "$file" ] doğru olduqda) çox fərqli imkanlar var:

  • fayl yoxdur
  • fayl mövcuddur, lakin müntəzəm bir fayl deyil
  • fayl var, ancaq üst dizini axtarmaq icazəniz yoxdur
  • fayl var, amma bu yol çox uzun
  • Fayl normal faylın simvolik bir keçididir, ancaq sembolik bir linkin həllində iştirak edən bəzi qovluqları axtarmaq icazəniz yoxdur.
  • ... stat() sisteminin çağırışının uğursuz ola biləcəyi başqa bir səbəb.

Bir sözlə, bu olmalıdır:

 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 

Faylın mövcud olmadığını bilmək üçün, stat() sistemi çağırışına ehtiyacımız var: ENOENT ( ENOTDIR bizə yolun tərkib hissələrindən birinin bir qovluq olmadığını bildirir, bu faylın mövcud olmadığını deyə bilərik. bu yolla). Təəssüf ki, komanda [ bunu bildirmir. Hata kodunun ENOENT, EACCESS (icazə yalanlaması), ENAMETOOLONG və başqa bir şey olub-olmaması yalançıdır.

[ -e "$file" ] testi ls -Ld -- "$file" > /dev/null istifadə edərək də həyata keçirilə bilər. Bu halda ls , stat() sisteminin nə üçün asanlıqla istifadə oluna bilməməsinə baxmayaraq, niyə stat() ?

 $ 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 

Ən azı ls mənə bunu deyir, çünki fayl yoxdur, bunun uğursuz olması. Bunun səbəbi, faylın mövcud olub-olmadığı müəyyən edilə bilməz. Komanda [ problemi yalnız görməmişdilər.

zsh kabuğunu istifadə edərək, zsh sonra xüsusi $ERRNO dəyişənini istifadə edərək səhv kodunu $ERRNO [ və bu nömrəni zsh/system modulunda xüsusi $errnos ilə zsh/system :

 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 

( ən son gcc versiyaları ilə zsh bəzi versiyalarında $errnos dəstəyindən çəkinin).

7
14 окт. Stephane Chazelas tərəfindən verilən cavab 14 oktyabr 2016-10-14 18:18 '16 'da 18:18' də 2016-10-14 18:18 'də

Baş xüsusi istifadə edə bilərsiniz:

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

və ya

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

Dosyayı və qovluğu həm də kontrol etmək istəyirsinizsə, -f əvəzinə -e seçimini istifadə edin.

6
28 апр. Cavab 28 aprel Cihid tərəfindən verilir 2015-04-28 22:40 '15 at 10:40 pm 2015-04-28 22:40

Ən asan yol

 FILE=$1 [ ! -e "${FILE}" ]  echo "does not exist" || echo "exists" 
4
21 мая '14 в 9:11 2014-05-21 09:11 Cavab lancerex tərəfindən verilir 21 May '14 9:11 2014-05-21 09:11

Bu script wrapper da fayldakı qovluğu tapmaq üçün çalışır:

 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 авг. Cavab 29 sentyabrda Simmant tərəfindən verilir . 2013-08-29 09:59 '13 at 9:59 2013-08-29 09:59

bəzən istifadə etmək rahatdır və || operatorlar.

("Test" əmriniz varsa) kimi:

 test -b $FILE  echo File not there! 

və ya

 test -b $FILE || echo File there! 
0
11 апр. Cavab André 11 apr verilir . 2017-04-11 23:25 '17 saat 11:25 'də 2017-04-11 23:25

bağlı digər suallar və ya sual