mv -f คืออะไร


34

คู่มือ GNU coreutils สำหรับmvพูดว่า:

-f --force Do not prompt the user before removing a destination file.

อย่างไรก็ตามดูเหมือนว่านี่จะเป็นพฤติกรรมเริ่มต้นสำหรับmvดังนั้น-fตัวเลือกที่ดูเหมือนจะฟุ่มเฟือย เช่นใน GNU Bash เวอร์ชั่น 4.3.11:

$ ls -l
total 0
$ touch 1 2; mv -f 1 2; ls
2
$ touch 1 2; mv 1 2; ls
2

ดูเหมือนว่าไม่น่าจะเป็นความตั้งใจของ-fธงคือการแทนที่alias mv="mv -i"เพราะมีหลายวิธีมาตรฐานของการเอาชนะนามแฝง (เช่นการใช้\mv) ที่จะทำสิ่งนี้กระชับและในลักษณะที่สอดคล้องกันข้ามคำสั่ง

คู่มือตั้งข้อสังเกตว่า "หากคุณระบุตัวเลือกมากกว่าหนึ่งตัวเลือก -i, -f, -n จะมีผลเฉพาะตัวสุดท้ายเท่านั้น" แต่ดูเหมือนว่าไม่น่าจะเป็นไปได้ที่ความตั้งใจของ-fธงคือการแทนที่-iธงโดยทั่วไป เพราะพฤติกรรมเทียบเท่าสามารถทำได้โดยเพียงแค่ใช้ซึ่งเป็นมากขึ้นกระชับและเข้าใจกว่าการใช้mvmv -if

ในกรณีนี้วัตถุประสงค์ของ-fธงคืออะไร? ทำไมมันมีอยู่?


6
ค่าเริ่มต้นเป็นธุรกิจที่พิถีพิถัน ใช้เครื่องมือเช่นmountเช่น (แม้ว่าจะมีตัวอย่างที่ดีกว่า) คุณต้องการที่จะจำสิ่งที่เป็นค่าเริ่มต้นสำหรับทุกตัวเลือกเพื่อให้คุณสามารถกำหนดตัวเลือกที่คุณต้องการตั้งค่า? เป็นสิ่งที่ดีที่มีตัวเลือกทั้งค่าเริ่มต้นและไม่ใช่ค่าเริ่มต้นดังนั้นคุณสามารถตั้งค่าตัวเลือกได้อย่างชัดเจนแทนที่จะต้องติดตามจิตใจว่าค่าเริ่มต้นคืออะไร สิ่งที่มีคือง่ายต่อการจดจำกว่าบางสิ่งบางอย่างไม่ได้มี
Wildcard

พฤติกรรมที่เท่าเทียมกันไม่สามารถใช้งานได้หาก MV ถูกทำให้เป็น mv-i
PlasmaHH

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

คำตอบ:


41

การใช้-fคำอธิบายอย่างชัดเจนยิ่งขึ้นในหน้า manจาก 4BSD ซึ่งเป็นที่ที่ตัวเลือก-fและ-iเพิ่ม:

หากfile2มีอยู่แล้วจะถูกลบออกก่อนfile1ถูกย้าย หากfile2มีโหมดที่ห้ามการเขียน mv จะพิมพ์โหมดและอ่านอินพุตมาตรฐานเพื่อรับบรรทัด หากบรรทัดเริ่มต้นด้วย y การย้ายจะเกิดขึ้น ถ้าไม่ออก mv จะออก

ตัวเลือก:

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

-fย่อมาจากแรง ตัวเลือกนี้จะแทนที่ข้อ จำกัด โหมดใด ๆ หรือ-iสวิตช์

คำจำกัดความที่แม่นยำยิ่งขึ้นเกี่ยวกับวิธีที่ mv ดำเนินการได้รับในมาตรฐาน POSIXซึ่งเพิ่มการ-fแทนที่-iนั้นหากเกิดขึ้นภายหลังในบรรทัดคำสั่ง

ดังนั้นพฤติกรรมเริ่มต้นจึงแตกต่างจาก-fนี้เล็กน้อย ค่าเริ่มต้นคือการขอการยืนยันเมื่อเป้าหมายไม่สามารถเขียนได้ (พฤติกรรมนี้ย้อนกลับไปอย่างน้อยที่สุดเท่าที่V4ซึ่งmvไม่ได้ใช้ตัวเลือกใด ๆ ) หากได้รับ-iตัวเลือก mv จะขอการยืนยันเพิ่มเติมทุกครั้งที่มีเป้าหมาย -fตัวเลือกที่จะยับยั้งการถามในทั้งสองกรณีเหล่านั้น (ถ้ามันเกิดขึ้นหลังจากที่ใด ๆ-i)


คำตอบที่ดีขอบคุณ! NB ระบบไฟล์บางระบบ (เช่น CIFS) อาจทำให้ mv แสดงพฤติกรรมที่ไม่คาดคิด (เช่นแตกต่างจากคู่มือ) เช่นทำหน้าที่แม้ว่าใช้งาน-fแฟล็กแม้ว่าจะไม่ได้ใช้ก็ตาม
sampablokuper

เป็นเรื่องน่าสังเกตว่าการนำไปใช้งานจำนวนมากร้องขอการยืนยันเท่านั้นหากดูเหมือนว่าจะอยู่ในเทอร์มินัลเชิงโต้ตอบ ( isatty(0)) นอกจากนี้แม้ว่าจะเป็นความจริงที่การ-fแทนที่ในภายหลัง-iอาจไม่ได้หมายความว่าสิ่งนี้จะเหมือนกับข้อโต้แย้งที่ไม่ได้รับ
phk

15

มีประโยชน์เมื่อตั้งค่าการเรียกใช้งานmvให้เป็นค่าเริ่มต้นที่มีสติ:

alias mv="mv -i"

เมื่อคุณต้องการบังคับให้ย้ายสิ่งนี้จะทำงาน:

mv -f

เนื่องจากเป็นตัวเลือกสุดท้ายในคำสั่งส่วนขยายที่นับ:

mv -i -f

จุดนี้เป็นที่กล่าวถึงในคู่มือ GNU coreutils


1
ขอบคุณ แต่สำหรับเหตุผลที่ฉันได้เพิ่มตอนนี้คำถามที่ดูเหมือนว่าไม่น่าที่เอาชนะคือเหตุผลสำหรับการดำรงอยู่ของalias mv="mv -i" -f
sampablokuper

12
ฉันคัดค้านการโทรเริ่มต้น "ทำตามที่คุณถามไม่มีคำถามโง่ ๆ " พฤติกรรมของmv(1)(และคำสั่ง Unix อื่น ๆ ) "บ้า" ตามที่คุณพูดถึง ...
vonbrand

1
vonbrand ในขณะที่ฉันชื่นชมการตอบสนองโดยตรงของคำสั่ง Linux / UNIX โดยไม่ต้อง-iเชื่อว่าทุกคนที่ใช้บรรทัดคำสั่งมากกว่าสองสามปีที่ผ่านมาถูกเผาmvในจุดใดจุดหนึ่ง
Alexander

1
คุณอาจคิดว่าการเอาชนะ -i นั้นไม่น่าเป็นไปได้ แต่นั่นเป็นเหตุผลว่าทำไมฉันถึงเดาว่า -f นั้นถูกใช้อย่างนั้น
วอลเตอร์

11

มันมีอยู่เพราะ ( man mv)

ถ้าคุณระบุมากกว่าหนึ่ง-i, -f, -nเพียงหนึ่งสุดท้ายจะมีผล

ดังนั้นคุณสามารถมีสคริปต์ / นามแฝง / ฟังก์ชั่นที่มักจะถาม แต่คุณยังสามารถแทนที่ตัวเลือก

# alias
alias mv='mv -i'

# function
MV () { mv -i "$@" ; }

# script
#!/bin/bash
mv -i "$@"

ฟังก์ชั่น / สคริปต์ที่มีความหมายจะทำอะไรมากกว่านี้แน่นอน (เช่นบันทึกการทำงาน)


@choroba ขอบคุณ แต่สำหรับเหตุผลที่ฉันได้เพิ่มตอนนี้คำถามที่ดูเหมือนว่าไม่น่าที่เอาชนะนามแฝงเช่นเหตุผลสำหรับการดำรงอยู่ของalias mv="mv -i" -fคุณพูดถึงสคริปต์และฟังก์ชั่นเช่นกัน คุณช่วยยกตัวอย่างการใช้สองสิ่งนี้ได้ไหม
sampablokuper

@sampablokuper: อัปเดตแล้ว
choroba

@choroba ขอขอบคุณอีกครั้ง น่าเศร้าที่ตัวอย่างฟังก์ชันของคุณและตัวอย่างสคริปต์ของคุณไม่ใช้mv -fดังนั้นจึงยังไม่ชัดเจนสำหรับฉันว่าพวกเขาแสดงให้เห็นถึงเหตุผล / อธิบายการมีอยู่ของมัน ขออภัยถ้าฉันขาดความชัดเจน!
sampablokuper

@sampablokuper: mv -iพวกเขาใช้งานทั้งหมด หากคุณต้องการใช้พวกเขา แต่ข้ามการโต้ตอบคุณจะใช้MV -fฯลฯ
choroba

1
@sampablokuper พฤติกรรมของmvโดยไม่ต้องมีตัวเลือกเหล่านั้นคือการบางครั้งถาม (เป้าหมายไม่สามารถเขียนและการโต้ตอบขั้ว) ดังนั้นนี้จะเป็นความแตกต่างที่ชัดเจนระหว่างและmv -f \mv
phk

5

mvคำสั่งในการทำงานสามารถของตัวเองที่แตกต่างกันกับ-fตัวเลือกในการที่จะพยายามที่จะเขียนป้องกันไฟล์เขียนทับโดยไม่ต้องพรอมต์

user2@host:location> ls -l ./
drwxrwxr-x 2 user1 users    10   Oct 16 12:58 dir
user2@host:location> ls -l ./dir/
-rw-r--r-- 2 user1 users     0   Oct 16 12:58 file1
-rw-r--r-- 2 user2 users     0   Oct 16 12:58 file2
user2@host:location> \mv ./dir/file2 ./dir/file1
'mv' try to overwrite './dir/file1', overridding mode 0644 (rw-r--r--)? n
user2@host:location> \mv -f ./dir/file2 ./dir/file1
user2@host:location> ls -l ./dir/
-rw-r--r-- 2 user2 users     0   Oct 16 12:58 file1

เนื่องจากสิทธิ์ในการเขียนในไดเร็กทอรี user2 สามารถเขียนทับไฟล์ user1 ใน./dir/แต่จะถูกเตือนก่อนที่จะทำเช่นนั้น -fป้องกันการเตือน


-1

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

หมายเหตุ: การเลิกทำนามแฝงสามารถทำให้ / ลบผลข้างเคียง หากคุณใช้นามแฝงคำสั่งเป็นเวอร์ชันอื่นหรือมีตัวเลือกเพิ่มเติมการยกเลิกชื่อแทนจะทำให้เกิดผลข้างเคียงที่ไม่พึงประสงค์ ตัวอย่างเช่นคุณอาจมีการตั้งค่านามแฝงด้วย mv และ rm เพื่อใช้รีไซเคิลได้ (หรือระบบป้องกัน / ติดตามอื่น ๆ ) การเลิกทำนามแฝงจะทำให้รายการนี้ ...


Nitpick: -fตัวเลือกสำหรับ cp หรือ mv ไม่รับประกันว่า "ใช้งานได้" ตัวอย่างเช่นหากการอนุญาตไม่เพียงพอคำสั่ง -f จะไม่ทำงาน สิ่งที่คุณหมายถึงคือ -f บังคับให้เขียนทับโดยไม่แจ้งให้ทราบ ธงตรงกันข้าม - ฉันหมายถึงต้องมีการโต้ตอบในการเขียนทับ
Eric Leschinski

สองสิ่งที่ควรทราบ: 1. ) การติดตั้งใช้งานปกติจะทดสอบว่าคุณอยู่ในเทอร์มินัลเชิงโต้ตอบ ( isatty(0)) หรือไม่ดังนั้นหากสคริปต์ของคุณทำงานในส่วนของไปป์ 2. ) การเพิ่ม-fไม่ได้เช่นเดียวกับการยกเลิก-iเพราะmv -i -fแตกต่างจากการmvดูคำตอบของมาร์ค
phk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.