Jawaban ini mengungkapkan bahwa seseorang dapat menyalin semua file - termasuk yang tersembunyi - dari direktori src
ke direktori dest
seperti:
mkdir dest
cp -r src/. dest
Tidak ada penjelasan dalam jawaban atau komentarnya tentang mengapa ini benar-benar berfungsi, dan sepertinya tidak ada yang menemukan dokumentasi mengenai hal ini juga.
Saya mencoba beberapa hal. Pertama, kasus normal:
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src dest
$ ls -A dest
dest_file src
Kemudian, dengan /.
di akhir:
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/. dest
$ ls -A dest
dest_file .dotfile src_dir src_file
Jadi, ini berlaku secara simultan *
, tetapi juga menyalin file tersembunyi.
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/* dest
$ ls -A dest
dest_file src_dir src_file
.
dan ..
merupakan tautan keras yang tepat seperti yang dijelaskan di sini , sama seperti entri direktori itu sendiri.
Dari mana perilaku ini berasal, dan dari mana itu didokumentasikan?
cp
referensi jelas menjelaskan bagaimanacp -R
bekerja..
dan..
direktori sama seperti direktori lainnya, tidak ada yang magis atau misterius tentang mereka..
dan..
tidak berperilaku seperti direktori lain.Jawaban:
Perilaku adalah hasil logis dari algoritma yang didokumentasikan untuk
cp -R
. Lihat POSIX , langkah 2f:.
dan..
adalah direktori, masing-masing direktori saat ini, dan direktori induk. Tidak ada yang khusus sejauh menyangkut shell, jadi tidak ada yang peduli dengan ekspansi, dan direktori akan disalin termasuk file tersembunyi.*
, di sisi lain, akan diperluas ke daftar file, dan ini adalah tempat file tersembunyi disaring.src/.
adalah direktori saat ini di dalamsrc
, yang dengansrc
sendirinya;src/src_dir/..
adalahsrc_dir
direktori induk, yang lagisrc
. Jadi dari luarsrc
, apakahsrc
direktori, menentukansrc/.
atausrc/src_dir/..
sebagai sumber file untukcp
setara, dan menyalin kontensrc
, termasuk file tersembunyi.Maksudnya
src/.
adalah ia akan gagal jikasrc
bukan direktori (atau tautan simbolis ke direktori), sedangkansrc
tidak. Itu juga akan menyalin kontensrc
saja, tanpa menyalinsrc
sendiri; ini juga cocok dengan dokumentasi:Jadi
cp -R src/. dest
menyalin isi darisrc
kedest/.
(file sumber ada.
disrc
), sedangkancp -R src dest
menyalin kontensrc
kedest/src
(file sumbersrc
).Cara lain untuk memikirkan ini adalah membandingkan menyalin
src/src_dir
dansrc/.
, daripada membandingkansrc/.
dansrc
..
berperilaku sepertisrc_dir
pada kasus sebelumnya.sumber
src
akan menyalin direktori ke dalamdest
,src/.
akan menyalin konten. Saya akan mencoba menjelaskannya dalam pertanyaan.src/.
dansrc/*
(catatan, bukansrc/.*
);src/*
tidak menyertakan file tersembunyi jika globbing mengabaikannya ...src
berisisrc/.
tetapi itu berarti bahwa direktori yang berisi suatu direktori tergantung pada bagaimana Anda menamai direktori tersebut. Tentu saja keberadaan.
tautan dengan cara itu berarti bahwa semua direktori mengandung dirinya sendiri, tetapi itu mungkin tidak intuitif untuk semua. Alih-alih perilaku ini, orang mungkin juga tergoda untuk menganggap bahwa "direktori yang berisi direktorifoo
" akan ditentukan olehfoo/..
, dalam hal ini tidak masalah jika kita merujukfoo
ataufoo/.
: direktori yang berisi hasilnya akan sama.foo
danfoo/.
tampaknya agak rumit, tapi saya tidak keberatan, saya juga merasa sedikit lucu.Saat Anda berlari
cp -R src/foo dest
, Anda akan mendapatkannyadest/foo
. Jadi jika direktoridest/foo
tidak ada,cp
akan membuatnya, dan kemudian salin kontensrc/foo
kedest/foo
.Ketika Anda menjalankan
cp -R src/. dest
,cp
melihat yangdest/.
ada, dan hanya masalah menyalin kontensrc/.
kedest/.
.Ketika Anda menganggapnya sebagai menyalin direktori
.
darisrc
dan menggabungkan isinya dengan direktori yang adadest/.
, itu akan masuk akal.sumber