Unix: Slash หลังชื่อไดเรกทอรีหรือไม่


13

ความแตกต่างระหว่างคำสั่งต่อไปนี้คืออะไร?

mv foo bar
mv foo/ bar/
mv foo/ bar
mv foo bar/

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


2
มันเป็นเรื่องจริงสำหรับ rsync มันเริ่มต้นการคัดลอกด้วยตัวเองไดเรกทอรีหรือรายการภายใต้มันขึ้นอยู่กับว่าคุณข้ามหรือเพิ่มเครื่องหมายทับตามลำดับ
maxelost

@ maxelost: คุณสามารถเพิ่มคำตอบด้วยตัวอย่างเพื่อให้ชัดเจนซึ่งทำอะไร
Svish

มิเคลตอบอย่างชัดเจนด้านล่างฉันคิดว่า
maxelost

คำตอบ:


17

ยูทิลิตี Unix จำนวนมากปฏิบัติต่อ symlink ต่างกันโดยขึ้นอยู่กับว่ามีเครื่องหมายทับหรือไม่

พฤติกรรมนี้อธิบายไว้ในเอกสารประกอบ POSIX Symbolic Linkและยังกล่าวถึงในเอกสารประกอบ coreutils ของ GNUเอกสาร

โดยพื้นฐานแล้วเครื่องหมายต่อท้ายหมายถึงการติดตาม (หรือ "การอ้างอิง") ​​symlink

ตัวอย่างเช่นในโค้ดด้านล่างdirlinkหมายถึง symlink แต่dirlink/หมายถึงไดเรกทอรีที่ symlink ชี้ไป rmจะไม่ลบไดเรกทอรีเว้นแต่คุณจะพูดrm -rแต่rmหากไม่มีตัวเลือกจะเป็นการลบ symlink อย่างมีความสุข

$ mkdir dir
$ ln -s dir dirlink
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir
lrwxrwxrwx 1 mikel mikel    3 2011-02-02 22:26 dirlink -> dir
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir
lrwxrwxrwx 1 mikel mikel    3 2011-02-02 22:26 dirlink -> dir
$ rm dirlink/
rm: cannot remove `dirlink/': Is a directory
$ rm dirlink
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir

นอกจากนี้ยังมีประโยชน์สำหรับการดูสิทธิ์ของไดเรกทอรีโดยไม่ต้องกังวลว่าไดเรกทอรีนั้นเป็นไดเรกทอรีจริงหรือเพียงแค่ symlink ไปยังไดเรกทอรี

$ ls -ld dirlink
lrwxrwxrwx 1 mikel mikel 3 2011-02-02 22:46 dirlink -> dir
$ ls -ld dirlink/
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dirlink/

และยังใช้งานได้กับไดเรกทอรีปกติ:

$ ls -ld dir
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dir
$ ls -ld dir/
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dir/

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

$ find dir
dir
dir/file
$ find dirlink
dirlink
$ find dirlink/
dirlink/
dirlink/file

(การค้นหาบางรุ่นมีตัวเลือก-followหรือ-Lตัวเลือก แต่มันทำให้มันเป็นไปตาม symlink ทั้งหมดไม่ใช่แค่อันแรก)


ในกรณีของrsyncว่าคุณควรผนวกเครื่องหมายทับขึ้นอยู่กับว่าคุณต้องการให้ไดเรกทอรีที่คุณกำลังคัดลอกเป็นไดเรกทอรีย่อยหรือไม่

$ mkdir dir
$ touch dir/file
$ rsync -r dir dir.bak
$ find .
.
./dir
./dir/file
./dir.bak
./dir.bak/dir
./dir.bak/dir/file
$ rm -r dir.bak
$ rsync -r dir/ dir.bak
$ find .
.
./dir
./dir/file
./dir.bak
./dir.bak/file

ในคำอื่น ๆ :

  • rsync dir dir.bakคัดลอกdirเข้าdir.bakทำdirภายในdir.bak
  • rsync dir/ dir.bakคัดลอกเนื้อหาทั้งหมดของdirโดยไม่ต้องทำdirภายในdir.bak

2

ดังที่ jsalonen ได้กล่าวไปแล้วคำสั่งเหล่านี้ย่อมมีผลลัพธ์เหมือนกันหากfooและbarเป็นไดเรกทอรีที่แท้จริง

อย่างไรก็ตามหากfooและbarไม่ใช่ไดเร็กทอรีคำสั่งจะล้มเหลวหากคุณต่อท้ายเครื่องหมายสแลชและจะสำเร็จถ้าคุณไม่ต่อท้าย สิ่งนี้คือถ้าคำสั่งประสบความสำเร็จคำสั่งนั้นอาจไม่ได้ผลตามที่คุณต้องการ ในความเป็นจริงคุณอาจสูญเสียข้อมูลหากfooและbarเป็นไฟล์ (barจะถูกเขียนทับ)

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

นอกจากนี้คำสั่ง (หายาก) บางคำสั่งจะทำงานแตกต่างกันไปตามการมีอยู่ของเครื่องหมายสแลชต่อท้ายแม้จะมีไดเรกทอรี (ตัวอย่างหนึ่งคือrsync)


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