Bash one-liner để tạo một tệp nguyên tử nếu nó không tồn tại


9

Tôi muốn một Bash-liner mà nguyên tử tạo ra một tệp nếu nó không tồn tại. Điều đó có nghĩa cơ bản là "nếu tệp không tồn tại, hãy tạo nó" nhưng đảm bảo rằng không ai khác quản lý để tạo tệp trong không gian nhỏ giữa thực hiện if và tạo tệp.


Xin lỗi, tôi đọc 'nguyên tử' là 'tự động.' Tôi đã xóa câu trả lời của tôi.
Aaron Copley

Câu trả lời:


6

Ăn cắp một câu trả lời từ nhiều bình luận và liên kết đến [SO]. Có vẻ như có một phương pháp tuân thủ POSIX không liên quan mkdirnhư tôi đã đề cập trong câu trả lời ban đầu của mình bên dưới

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

Chuyển hướng này đến tệp trả về 0 hoặc không thành công và trả về khác không nếu tệp đã tồn tại.


Câu trả lời gốc

Bạn sẽ phải sử dụng mkdir- đó là nguyên tử, hoặc thư mục được tạo và bạn có thể tiếp tục hoặc nó không được tạo để bạn có hành động thích hợp.

Tất nhiên, mkdirkhông tạo tệp nhưng một khi bạn biết bạn có quyền truy cập độc quyền vào thư mục thì bạn có thể tạo tệp bạn muốn trong đó.

Như một lớp lót - tôi sẽ để nó cho bạn. Cá nhân tôi sẽ viết nó qua một vài dòng, vì điều đó sẽ dễ duy trì hơn.


Nhưng noclobber từ stackoverflow.com/q/13828544/1207760 là những gì OP muốn.
Luật29

Noclobber, nói chung, là một câu trả lời tốt. Nhưng nó không hoạt động cho ksh88.
jrw32982 hỗ trợ Monica

1
@JohnWiersba nhưng câu hỏi là về bash.
womble

@womble có nhưng câu trả lời đề cập đến POSIX mà ai đó có thể hiểu là câu trả lời áp dụng cho các shell khác. Ksh88 vẫn là vỏ tiêu chuẩn trên một số máy chủ.
jrw32982 hỗ trợ Monica

0

Là tập tin hoặc thư mục? Nếu tệp, bạn có thể sử dụng lệnh chạm đơn giản - nếu tệp tồn tại, nó chỉ sửa đổi thời gian truy cập cuối cùng. Nếu tập tin không tồn tại, được tạo ra.


0

Hãy thử cái này Việc lncung cấp các chức năng kiểm tra và thiết lập.

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

Nếu bạn không quan tâm đến tên tệp, bạn có thể ủy thác tác vụ này cho một tiện ích, ví dụ như 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.

Cầu nguyện:

filename=$(mktemp)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.