Unix: Slash setelah nama direktori atau tidak

13

Apa perbedaan antara perintah berikut?

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

Atau tidak ada perbedaan? Atau apakah itu tergantung pada perintah yang digunakan? Pikirkan misalnya saya membaca bahwa perilaku rsync sedikit berubah tergantung pada versi yang Anda gunakan. Adakah yang memiliki penjelasan yang baik sehingga saya tidak perlu menebak lagi dan merasa seperti saya tahu apa yang saya lakukan?

Svish
sumber
2
Itu berlaku untuk rsync. Itu mulai menyalin baik dengan direktori itu sendiri atau dengan item di bawahnya, tergantung pada apakah Anda melewatkan atau menambahkan garis miring, masing-masing.
maksimal
@ Maxelost: Bisakah Anda menambahkan jawaban dengan beberapa contoh sehingga sangat jelas yang melakukan apa?
Svish
Mikel menjawabnya dengan jelas di bawah ini, saya kira.
maksimal

Jawaban:

17

Banyak utilitas Unix memperlakukan symlink secara berbeda tergantung pada apakah ada garis miring.

Perilaku ini dijelaskan dalam dokumentasi POSIX Symbolic Link dan juga disebutkan dalam dokumentasi GNU coreutils .

Pada dasarnya, trailing slash berarti mengikuti (atau "dereference") symlink.

Misalnya, dalam kode di bawah ini, dirlinkberarti symlink, tetapi dirlink/berarti direktori yang ditunjuk symlink. rmtidak akan menghapus direktori kecuali jika Anda mengatakannya rm -r, tetapi rmtanpa opsi dengan senang hati akan menghapus 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

Ini juga berguna untuk melihat izin direktori, tanpa harus repot apakah direktori tersebut adalah direktori nyata atau hanya symlink ke direktori.

$ 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/

dan masih berfungsi untuk direktori reguler:

$ 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/

Contoh lain adalah findperintah. Jika pathAnda memintanya untuk mencari adalah symlink, itu tidak akan mengikuti symlink secara default, artinya hanya memproses symlink. Menambahkan garis miring menjadikannya memperlakukan symlink sebagai direktori yang menunjuk ke tautan.

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

(beberapa versi find memiliki -followatau -Lopsi, tetapi itu membuatnya mengikuti semua symlink, bukan hanya yang pertama)


Dalam kasus rsync, apakah Anda harus menambahkan garis miring tergantung pada apakah Anda ingin direktori yang Anda salin menjadi subdirektori atau tidak.

$ 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

Dengan kata lain:

  • rsync dir dir.baksalinan dirke dir.bak, membuat dirbagian dalamdir.bak
  • rsync dir/ dir.bakmenyalin semua isi dir, tanpa membuat dirbagian dalamnyadir.bak
Mikel
sumber
2

Seperti yang sudah dikatakan jsalonen, perintah ini memang memiliki hasil yang identik jika foodan bar, pada kenyataannya, adalah direktori.

Namun, jika foodan barbukan direktori, maka perintah akan gagal jika Anda menambahkan garis miring, dan akan berhasil jika Anda tidak. Masalahnya, jika perintah berhasil, itu mungkin tidak akan memiliki hasil yang Anda maksudkan. Bahkan, Anda bahkan bisa kehilangan data jika foodan barfile ( barakan ditimpa).

Jika maksud Anda adalah untuk menentukan direktori dan bukan file, maka Anda harus menggunakan garis miring, karena itu membuat perintah lebih kuat: jika harapan itu fooatau bardirektori gagal, maka perintah akan gagal dengan anggun, bukannya memiliki hasil yang tidak terduga.

Juga, beberapa perintah (jarang) berperilaku berbeda tergantung dari keberadaan garis miring, bahkan dengan direktori (salah satu contohnya rsync).

Etienne Dechamps
sumber
Ya, karena saya menyiratkan perintah mungkin atau mungkin tidak menangani garis miring dengan baik. Sangat bagus bahwa Anda memberikan rsync sebagai contoh!
jsalonen