GNU/Linux >> Belajar Linux >  >> Linux

perbedaan salin konten folder antara /. dan /* di linux

Ada perbedaan mendasar antara kedua bentuk argumen ini. Dan penting untuk memahami apa yang sedang terjadi.

Dengan ../foldersource/. argumen diteruskan tidak berubah ke perintah, apakah itu cp atau rm atau sesuatu yang lain. Terserah perintah apakah trailing dot itu memiliki semantik khusus atau unik yang berbeda dari konvensi Unix standar yang hanya menunjuk ke direktori tempatnya berada; keduanya rm dan cp tampaknya memperlakukannya sebagai kasus khusus.

Dengan ../foldersource/* argumen pertama kali diperluas oleh shell before perintah bahkan pernah dieksekusi dan memberikan argumen apa pun. Jadi, rm tidak pernah melihat ../foldersource/*; ia melihat versi yang diperluas ../foldersource/file1.ext ../foldersource/file2.ext ../foldersource/childfolder1 dan seterusnya. Ini penting karena sistem operasi membatasi jumlah argumen yang dapat diteruskan ke sebuah perintah, biasanya hanya beberapa ratus.


Saat Anda menyalin menggunakan cp -a source/* target/ Anda menyalin sebagian besar file dan direktori dari source ke target . Khususnya, item yang dikecualikan mungkin berupa file yang dimulai dengan titik (. ) di tingkat atas source .

Pertimbangkan file-file ini (atau direktori) di source

apple        # will be copied
banana/      # will be copied, as will all its contents
.cherry      # will not be copied

Saat Anda menyalin menggunakan cp -a source/. target/ Anda menyalin seluruh konten source , termasuk item apa pun yang dimulai dengan titik (. ) ke target

Pertimbangkan file-file ini (atau direktori) di source

apple        # will be copied
banana/      # will be copied, as will all its contents
.cherry      # will be copied

Jika Anda menggunakan bash , zsh , Anda dapat menggunakan dotglob opsi untuk mengubah arti dari * sehingga menyertakan file dan direktori yang diawali dengan titik (yash juga memiliki dotglob pilihan; namun, itu kemudian menyertakan . dan .. dalam ekspansi glob yang membatasi kegunaannya. Lihat juga FIGNORE='@(.|..)' di ksh93 ).

Menariknya, cp -a source/. target/ dijamin tidak pernah untuk membuat komponen target/source . (Di sisi lain, cp -a source target/ akan melakukan salah satu dari dua hal tergantung pada apakah target atau tidak sudah ada. Lihat Cara menyalin folder secara rekursif dengan cara idempoten menggunakan cp untuk detailnya.)

Saat Anda menghapus menggunakan rm -rf source/* Anda menghapus file dan direktori di dalam source yang tidak dimulai dengan titik (. ). Tunduk pada dotglob pengaturan yang telah saya sebutkan. Itu tidak akan menghapus direktori source itu sendiri.

Saat Anda mencoba menghapus menggunakan rm -rf source/. itu akan gagal - seperti yang telah dijelaskan orang lain - karena POSIX melarang penghapusan jalur yang komponen terakhirnya adalah . atau .. . Padanan terdekatnya adalah rm -rf source , yang akan menghapus source direktori dan semua isinya terlepas dari apakah dimulai dengan titik atau tidak (. ).


Anda tidak dapat melakukan rm -rf ../foldersource/. karena rm tidak mengizinkan ini, seperti yang dinyatakan secara eksplisit dalam manual:

Upaya apa pun untuk menghapus file yang komponen nama file terakhirnya adalah '.' atau '..' ditolak tanpa diminta, seperti yang diamanatkan oleh POSIX.

dan dalam manual POSIX man 1p rm kita melihat:

Jika salah satu file dot atau dot-dot ditentukan sebagai bagian nama dasar dari sebuah operan (yaitu, komponen nama jalur terakhir) atau jika sebuah operan memutuskan ke direktori root, rm akan menulis pesan diagnostik ke kesalahan standar dan tidak melakukan apa pun dengan operan tersebut .


Linux
  1. Apa perbedaan antara wadah Linux dan gambar?

  2. Perbedaan Antara Perintah "su" dan "su -" di Linux

  3. Perbedaan Antara [[ $a ==Z* ]] Dan [ $a ==Z* ]?

  1. Windows – Folder Bersama Antara Qemu Windows Guest dan Linux Host?

  2. Linux – Perbedaan Antara Pts Dan Tty?

  3. Perbedaan antara jalur absolut dan relatif di Linux

  1. perbedaan linux antara sudo crontab -e dan hanya crontab -e

  2. Perbedaan antara cp -r dan cp -R (perintah salin)

  3. Perbedaan antara perintah 'ifconfig' dan 'ip'