วิธีสร้างไฟล์ที่มีชื่อเหมือนอาร์กิวเมนต์บรรทัดคำสั่ง


29

ฉันสงสัยว่าจะสร้างไฟล์ที่มีชื่ออย่างไรเช่นหากฉันต้องการสร้างชื่อโฟลเดอร์-aคำสั่งใดที่จะใช้เคล็ดลับ?

ฉันพยายามmkdir '-a', mkdir \-aและการทำงานค่า ฉันใช้งาน Ubuntu


13
คำตอบที่นี่มีดีทั้งหมด แต่ฉันไม่สามารถคิดว่าเป็นเหตุผลที่ไม่ได้หมุนรอบจะต้องการที่จะทำเช่นนี้ ...
evilsoup

@evilsoup บางคนชอบนำหน้าโฟลเดอร์เพื่อให้ติดที่ด้านบนของรายชื่อเรียงตามตัวอักษรและตัวเลข แต่นั่นเป็นเหตุผลเดียวที่ฉันสามารถคิดได้ว่าจะซื่อสัตย์
slhck

@slhck ฉันรู้อย่างน้อยหนึ่งหลักสูตรการตัดต่อวิดีโอที่พวกเขาสนับสนุนให้นักเรียนเพิ่มพื้นที่ว่างในไดเรกทอรีของโครงการเพื่อให้พวกเขาจะปรากฏขึ้นที่ด้านบน iMacs ส่วนรวม นี้เป็นที่น่าเกลียดและนำไปสู่การเพิ่มเฮฮา แต่อย่างน้อยมันจะไม่อาจทำลายระบบ ...
evilsoup

3
ส่วนใหญ่นี่คือที่นี่เพื่อความสนใจทางวิชาการ
MYV

5
การ์ตูนที่มีข้อผูกมัด
fluffy

คำตอบ:


49

เรียกคำสั่งดังนี้:

mkdir -- -a

--หมายความว่าตัวเลือกจบหลังจากนั้นจึงได้รับการตีความตามตัวอักษรและไม่เป็นตัวเลือกให้กับ-a mkdirคุณจะพบกับรูปแบบนี้ไม่เพียง แต่ในmkdirแต่ใด ๆ ยูทิลิตี้ POSIX สอดคล้องยกเว้นและecho จากข้อกำหนด :test

อาร์กิวเมนต์ - ควรได้รับการยอมรับเป็นตัวคั่นที่ระบุถึงจุดสิ้นสุดของตัวเลือก อาร์กิวเมนต์ใด ๆ ต่อไปนี้ควรถือเป็นตัวถูกดำเนินการแม้ว่าจะเริ่มต้นด้วยอักขระ '-' อาร์กิวเมนต์ - ไม่ควรใช้เป็นตัวเลือกหรือเป็นตัวถูกดำเนินการ

--ขอแนะนำให้ใช้การป้องกันเป็นอย่างดีสำหรับการกระทำใด ๆ ที่คุณจัดการกับชื่อไฟล์และต้องการให้แน่ใจว่าพวกเขาจะไม่ทำลายคำสั่งเช่นเมื่อย้ายไฟล์ในลูปคุณอาจต้องการเรียกสิ่งต่อไปนี้เพื่อให้ไฟล์ชื่อ-iisn ' t (ใน) แยกวิเคราะห์อย่างถูกต้องเป็นตัวเลือก:

mv -- "$f" new-"$f"

ข้อเสียของวิธีการนี้คือการยุติการประมวลผลตัวเลือกอย่างแม่นยำ สำหรับตัวอย่าง mkdir ง่าย ๆ ที่ได้ผลมหัศจรรย์; หากคุณต้องการตัวเลือกในการติดตามชื่อไฟล์ในบรรทัดคำสั่งมันจะไม่ทำงานเลย
CVn

1
แน่นอน - มีข้อเสียสำหรับทุกสิ่ง ในกรณีที่คุณจัดการกับชื่อไฟล์สลับกับตัวเลือกการแก้ปัญหาของ Amosจะเป็นทางเลือกเดียวที่ฉันนึกได้ แต่ขึ้นอยู่กับว่าเครื่องมือแยกวิเคราะห์ตัวเลือกอย่างไร
slhck

1
เนื่องจาก OP พูดถึงการสร้างไฟล์ที่มีชื่อ "ชอบอาร์กิวเมนต์บรรทัดคำสั่ง" (สมมติว่าหมายถึงชื่อที่ขึ้นต้นด้วยเครื่องหมายยัติภังค์) ฉันไม่คิดว่ามันเป็นข้อสันนิษฐานที่ไม่มีเหตุผลทั้งหมด ใช้cc -o -myfile -Wall -myfile.cเป็นตัวอย่างที่วางแผนไว้เพียงเล็กน้อยเท่านั้น ตัวแก้ไขใด ๆ ที่มีค่าควรจะสามารถบันทึกลงในไฟล์ที่มีชื่อ-myfile.cหากคุณถามถึงสิ่งนั้น แต่คอมไพเลอร์ C อาจจะไม่ทำสิ่งที่คุณต้องการเมื่อได้รับรายการตัวเลือกดังกล่าว
CVn

1
@Maksim ตัวอย่างคำสั่งที่ต้องการตัวเลือกในการตั้งค่าชื่อไฟล์อินพุตหรือเอาต์พุตเช่นccคำสั่งที่ Michael ให้ไว้ข้างต้นซึ่งมี-oตัวเลือกเพื่อระบุไฟล์เอาต์พุต
slhck

1
ตัวอย่างลูปคือเหตุผลที่คุณควรใช้สิ่งที่เป็นเช่นนี้for f in ./*; do...แทนfor f in *; do...
evilsoup

21

วิธีที่ง่ายที่สุดที่ควรทำงานกับโปรแกรมที่เหมาะสมคือใช้ชื่อพา ธ สัมพัทธ์ด้านหน้า-เช่นmkdir ./-aจะสร้างไดเรกทอรีที่เรียกว่า-aในไดเรกทอรีทำงานปัจจุบัน

ตัวอย่างที่พบมากที่สุดของการใช้นี้ "เคล็ดลับ" rm ./-aคือเมื่อคุณต้องการที่จะลบไฟล์ซึ่งเริ่มต้นด้วยเส้นประเพื่อให้คุณสามารถทำ


3
แน่นอนว่าจะเป็นการหลอกลวงหากคุณทำงานกับพา ธ ของไฟล์เท่านั้นและไม่มีตัวเลือกบรรทัดคำสั่งใด ๆ ที่แยกวิเคราะห์เป็นสตริง แต่อย่างอื่น prefixing ./อยู่เสมอที่ดีความคิดจินตนาการที่คุณสร้างไฟล์ที่เรียกว่าและจากนั้นคุณเรียกว่า-rf rm *
slhck

1
@slhck สำหรับหลาย ๆ คนที่อาจดูเป็นเรื่องตลก แต่ฉันเห็นกรณีมากพอที่เรื่องแบบนี้เช็ดออก (ส่วนหนึ่ง) เซิร์ฟเวอร์ คุณไม่สามารถเตือนผู้คนได้มากพอเกี่ยวกับอันตรายของไฟล์ที่เริ่มต้นด้วยขีดกลาง ที่เดียวที่ฉันทำงานแม้จะเป็นกฎอย่างเป็นทางการ: อย่าสร้างไฟล์ที่ชื่อขึ้นต้นด้วย "-f" หรือ "-r"
Tonny

1
นี่ควรเป็นคำตอบ: มันเป็นวิธีพกพาเท่านั้น ( --ไม่เข้าใจทุกคำสั่งเพียงไม่กี่)
Olivier Dulac

@OlivierDulac ฉันคิดว่า--มันเป็นเรื่องน่ากลัวดังนั้นมันควรจะใช้ได้กับทุกโปรแกรมใช่ไหม
gsingh2011

@ gsingh2011 ไม่รหัสที่ตัดสินว่าเครื่องหมาย "-" ถือเป็น "จุดสิ้นสุดของธง" อาศัยอยู่ในแอปพลิเคชันและขึ้นอยู่กับแต่ละแอปพลิเคชันเพื่อตัดสินใจว่าจะปฏิบัติต่อด้วยวิธีนั้นหรือไม่
Amos Shapira

4

เหตุผลmkdir '-a'หรือmkdir \-aไม่ทำงานเป็นเพราะทั้งสองวิธี (ใช้เครื่องหมายคำพูดหรือแบ็กสแลช) ใช้เพื่อป้องกันเชลล์ของคุณ(น่าจะเป็นbash) ให้ความหมายพิเศษใด ๆ แก่พวกเขา เนื่องจากไม่ได้อะไรเป็นพิเศษหมายถึงเปลือกแล้วเหล่านี้ไม่มีผลกระทบต่อวิธีการที่จะได้รับการส่งต่อไปยัง-amkdir

เท่าที่mkdirเกี่ยวข้องจะได้รับรายการอาร์กิวเมนต์จากเชลล์และไม่สามารถบอกได้ว่าคุณใส่ไว้ในเครื่องหมายคำพูดหรือไม่หรือว่ามีเครื่องหมายแบ็กสแลช มันเห็นเพียงอาร์กิวเมนต์-aเดียว นั่นเป็นเหตุผลที่คุณต้องการคำ--อธิบายในคำตอบอื่น ๆ


-3

นอกจากคำตอบจาก "slhck" ยังมีเคล็ดลับอื่นที่บางครั้งใช้งานได้:

ใส่ชื่อไฟล์ที่มีปัญหาภายใน 2 ชุด qoutes (แตกต่างกัน) เหมือนหรือ"'-a'"'"-a"'

การทำงานนี้ขึ้นอยู่กับโปรแกรมหรือไม่ แต่เป็นทางเลือกสุดท้ายหากโปรแกรมไม่รองรับ--คุณสมบัติPOSIX
วิธี POSIX เป็นที่ต้องการเสมอเนื่องจากมีความน่าเชื่อถือ 100%


"วิธี POSIX เป็นที่ต้องการอยู่เสมอเพราะเชื่อถือได้ 100%" การใช้--เพื่อยุติการประมวลผลตัวเลือกยังถือว่าคุณไม่จำเป็นต้องใช้ตัวเลือกใด ๆ ในการติดตามชื่อไฟล์
CVn

@ MichaelKjörlingแน่นอน ... แต่ฉันคิดว่ามันคงชัดเจน
Tonny

4
สิ่งนี้จะสร้างไฟล์ที่เรียกว่า'-a'หรือ"-a"อย่างน้อยในระบบแบบ BSD
nohillside

4
คุณสามารถอ้างถึงระบบปฏิบัติการ / เปลือกที่นี้ไม่ทำงานหรือไม่
nohillside

1
หากใช้งานได้ดูเหมือนว่าคุณจะมีปัญหาค่อนข้างสำคัญในการจัดการกับไฟล์ที่มีชื่อล้อมรอบด้วยเครื่องหมายคำพูด
muhmuhten
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.