존재하지 않는 파일을 원자 적으로 생성하기위한 1 개의 라이너


9

파일이 없으면 원자 적으로 파일을 만드는 Bash one-liner를 원합니다. 이는 본질적으로 "파일이 존재하지 않으면 파일을 생성합니다"라는 의미이지만, if와 파일 생성 사이의 작은 공간에 다른 사람이 파일을 만들지 못하도록합니다.


죄송합니다. '원자'를 '자동으로'읽습니다. 답변을 삭제했습니다.
Aaron Copley

답변:


6

다양한 의견 및 답변 [SO]에서 답변훔치기 . 아래의 원래 답변에서 언급 한 것과 관련이없는 POSIX 호환 방법 이있는 것 mkdir같습니다.

set -o noclobber # or set -C
{ > file ; } &> /dev/null

파일 로 의이 경로 재 지정 은 0을 리턴하거나 파일이 이미 존재하면 실패하고 0이 아닌 값을 리턴합니다.


원래 답변

당신은 사용해야합니다 mkdir- 즉 원자의 어느 디렉토리가 생성됩니다 당신이 계속하거나 적절한 조치를 취할 수 있도록이 생성되지 않습니다.

물론 mkdir파일을 만들지는 않지만 디렉토리에 독점적으로 액세스 할 수 있다는 것을 알게되면 원하는 파일을 만들 수 있습니다.

하나의 라이너에 관해서는-나는 당신에게 맡길 것입니다. 개인적으로 몇 줄에 작성하면 유지 관리가 더 쉬워집니다.


그러나 stackoverflow.com/q/13828544/1207760의 noclobber는 OP가 원하는 것 이상입니다.
법률 29

Noclobber는 일반적으로 좋은 대답입니다. 그러나 ksh88에서는 작동하지 않습니다.
jrw32982는 Monica

1
@JohnWiersba 그러나 문제는 bash에 관한 것입니다.
울림

@womble 예. 대답은 POSIX를 언급하는데 다른 사람이 대답을 다른 쉘에 적용한다는 의미입니다. Ksh88은 여전히 ​​일부 서버의 표준 쉘입니다.
jrw32982는 Monica

0

파일입니까, 디렉토리입니까? 파일 인 경우 간단한 명령 터치를 사용할 수 있습니다. 파일이 있으면 마지막 액세스 시간 만 수정합니다. 파일이 존재하지 않으면 생성됩니다.


0

이거 한번 해봐. 는 ln시험 - 및 - 설정 기능을 제공합니다.

touch lock.$$.tmp
if ln lock.$$.tmp lock.dat 2>/dev/null
then
    echo "File is mine"
else
    echo "Test and set failed"
fi
rm -f lock.$$.tmp

0

파일 이름이 마음에 들지 않으면이 작업을 유틸리티 (예 : mktemp)에 위임 할 수 있습니다.

Create a temporary file or directory, safely, and print its name.
TEMPLATE must contain at least 3 consecutive `X's in last component.
If TEMPLATE is not spec‐ified, use tmp.XXXXXXXXXX, and --tmpdir is 
implied.  Files are created u+rw, and directories u+rwx, minus umask
restrictions.

기도:

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