파일이 있는지 확인하고 stdout에 (사용자 정의) 메시지를 인쇄하는 단일 명령?


18

이것을 발견해도 괜찮습니다.

test( [) 명령을 사용하여 파일 존재를 테스트 할 수 있다는 것을 이미 알고 있습니다 .

$ touch exists.file
$ if [ -f exists.file ] ; then echo "yes" ; else echo "no" ; fi
yes
$ if [ -f noexists.file ] ; then echo "yes" ; else echo "no" ; fi
no

...하지만 거기에 약간의 타이핑이 있습니다. :)그래서 "default"단일 명령이 있다면 방황하고있었습니다. 그러면 파일 존재 결과가 stdout?

test종료 상태와 함께 사용할 수도 있습니다 $?.

$ test -f exists.file ; echo $?
0
$ test -f noexists.file ; echo $?
1

... 그러나 이것은 여전히 ​​두 가지 명령입니다. 논리도 "역"입니다 (성공의 경우 0, 실패의 경우 0이 아님).

내가 묻는 이유는에서 파일 존재 여부를 테스트해야하기 때문입니다 gnuplot.이 파일 의 " system("command")stdout에서 결과 문자 스트림을 문자열로 반환합니다. "; 에서 gnuplot내가 직접 할 수 있습니다 :

gnuplot> if (0) { print "yes" } else { print "no" }
no
gnuplot> if (1) { print "yes" } else { print "no" }
yes

그래서 기본적으로 다음과 같은 것을 작성하고 싶습니다 (의사).

gnuplot> file_exists = system("check_file --stdout exists.file")
gnuplot> if (file_exists)  { print "yes" } else { print "no" }
yes

... 불행히도 testand 를 통해 직접 사용할 수는 없습니다 $?.

gnuplot> file_exists = system("test -f exists.file; echo $?")
gnuplot> if (file_exists)  { print "yes" } else { print "no" }
no

... 논리를 뒤집어 야합니다.

따라서 기본적으로 일종의 사용자 정의 스크립트 솔루션 (또는 스크립트를 한 줄짜리 인라인으로 작성)을 생각해 내야합니다 ... 0 또는 1을 인쇄 할 수있는 기본 명령이 이미 있다면 (또는 파일 존재를 위해 stdout 할 사용자 정의 메시지), 그렇게 할 필요가 없습니다. :)

( ls후보 일 수도 있지만 stdout 출력은 너무 장황합니다. 그것을 피하려면 모든 출력을 억제하고 다시 존재 상태를 반환해야합니다.

$ ls exists.file 1>/dev/null 2>/dev/null ; echo $? 
0
$ ls noexists.file 1>/dev/null 2>/dev/null ; echo $? 
2

...하지만 그것은 다시 두 개의 명령 (및 더 많은 타이핑)과 "반전 된"논리입니다 ...)

Linux에서이를 수행 할 수있는 단일 기본 명령이 있습니까?


2
방법은 ( [ -f py_concur.py ] && echo "file exists" ) || echo "file does not exist"?
iruvar

답변:


9

종료 상태가 역전 된 것처럼 들리므로 다음을 수행 할 수 있습니다.

system("[ ! -e file ]; echo $?")

또는:

system("[ -e file ]; echo $((!$?))")

( 파일이 존재 하고 일반 파일 인 경우를-f 위한 것 입니다 ).


5

이 단일 bash 명령을 사용하십시오.

 [ -f /home/user/file_name ]

[]성공에 대한 테스트 및 반환 0을 수행


3
두 경우 모두 CentOS
수륙 양용일

1
macOS에서 잘 작동합니다.
Joshua Pinter

1
이것을 사용하여 &&and ||연산자로 조건부로 명령을 실행할 수 있습니다 .[ -f /home/user/file_name ] || echo "File not present"[ -f /home/user/file_name ] && echo "File is present"
charlesreid1

1
@ charlesreid1의 사람이 일을합니다. 감사합니다!
Marta Karas

1

다음과 같이 "논리 반전"은 어떻습니까?

file_exists = 1-system("test -f exists.file; echo $?")

-1

이것은 작동합니다 :

pwsh -c Test-Path /etc/passwd

... PowerShell이 ​​설치되어있는 경우 경로가 존재하는 경우 문자열 "True"를, 그렇지 않으면 "False"를 리턴합니다. (이 답변에 대해 "비판적으로 도움이되지 않는"포인트가 있습니까?)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.