Bash หนึ่งซับเพื่อสร้างไฟล์แบบอะตอมถ้าไม่มีอยู่


9

ฉันต้องการ Bash one-liner ที่สร้างไฟล์แบบ atom ถ้าไม่มีอยู่ นั่นหมายความว่า "ถ้าไฟล์ไม่มีอยู่ให้สร้างมัน" แต่ต้องแน่ใจว่าไม่มีใครจัดการเพื่อสร้างไฟล์ในพื้นที่เล็ก ๆ ระหว่างการทำ if และการสร้างไฟล์


ขออภัยฉันอ่าน 'อะตอม' เป็น 'อัตโนมัติ' ฉันลบคำตอบของฉัน
Aaron Copley

คำตอบ:


6

ขโมยคำตอบจากความคิดเห็นและลิงก์ไปยัง [SO] ดูเหมือนว่ามีวิธีการPOSIXที่ไม่เกี่ยวข้องmkdirตามที่ฉันกล่าวไว้ในคำตอบดั้งเดิมของฉันด้านล่าง

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

การเปลี่ยนเส้นทางไปที่ไฟล์นี้ส่งคืน 0 หรือล้มเหลวและส่งกลับไม่ใช่ศูนย์หากไฟล์นั้นมีอยู่แล้ว


คำตอบเดิม

คุณจะต้องใช้mkdir- นั่นคืออะตอมมิเช่นนั้นไดเรกทอรีจะถูกสร้างขึ้นและคุณสามารถดำเนินการต่อหรือไม่สร้างขึ้นเพื่อให้คุณดำเนินการที่เหมาะสม

แน่นอนว่าmkdirจะไม่สร้างไฟล์ แต่เมื่อคุณรู้ว่าคุณมีสิทธิ์ในการเข้าถึงไดเรกทอรีอย่างพิเศษคุณสามารถสร้างไฟล์ที่คุณต้องการได้

สำหรับสายการบินหนึ่ง - ฉันจะปล่อยให้คุณ โดยส่วนตัวฉันจะเขียนมันเกินสองสามบรรทัดเพราะมันจะบำรุงรักษาได้ดีกว่า


แต่ noclobber จากstackoverflow.com/q/13828544/1207760เป็นสิ่งที่ OP ต้องการมากกว่า
Law29

โดยทั่วไปแล้ว Noclobber เป็นคำตอบที่ดี แต่มันไม่ทำงานสำหรับ ksh88
jrw32982 รองรับโมนิก้า

1
@ JohnWiersba แต่คำถามเกี่ยวกับทุบตี
womble

@ 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.