Saya memigrasi direktori home saya dari sistem lama ke yang baru, dan tarball yang saya buat berisi semuanya, termasuk file tersembunyi seperti .bashrc. Namun, ketika saya memindahkan konten tarball yang tidak dibongkar (yang ada di / tmp) ke direktori home saya yang baru, file-file yang disembunyikan tidak menyalin ( mv /tmp/home/rcook/* /home/rcook/
). Bagaimana saya bisa membuat saya memindahkan mereka?
Sebenarnya, saya pikir masalahnya bukan pada mv, tapi dengan bash's globbing. Jika saya melakukan ini:
mkdir a
mkdir b
touch a/.foo
touch a/bar
mv a/* b/
ls -a a/ b/
Saya melihat ini:
a/:
. .. .foo
b/:
. .. bar
a/.foo
tidak bergerak. Jadi bagaimana saya bisa mendapatkan * wildcard untuk menemukan file tersembunyi?
Ya, saya kira saya bisa mendekompres tarball langsung ke direktori home saya, tetapi tarball mendekompresi ke dalam home/rcook/...
, dan saya ingin memastikan saya menimpa tarball baru .bashrc
, dll. Dengan versi lama, yang disesuaikan, dan mengetahui bagaimana menemukan dan memindahkan file yang tersembunyi adalah keterampilan yang berharga. Saran?
Beberapa jawaban menyarankan melakukan sesuatu seperti mv src/.* dest/
. Namun, saya mencoba ini pada direktori pengujian saya dan mendapat kesalahan. Dimulai dengan:
rcook$ ls -a a/ b/
a/:
. .. bar .foo
b/:
. ..
rcook$ mv a/.* b/
mv: cannot move 'a/.' to 'b/.': Device or resource busy
mv: cannot remove 'a/..': Is a directory
rcook$ ls -a a/ b/
a/:
. .. bar
b/:
. .. .foo
Apa yang saya lakukan salah?
sumber
Jawaban:
Kamu bisa melakukan ini :
Anda bisa meletakkannya
di Anda
~/.bashrc
jika Anda ingin menjadi default.Lihat http://mywiki.wooledge.org/glob
Pendekatan lain untuk menyalin file dot:
Jangan gunakan pola
..*
karena cocok..
(pointer ke direktori induk). Jika ada file yang namanya dimulai dengan dua titik (..something
), gunakan juga pola..?*
.sumber
.
dan dir..
spesial: masing-masing dir & dir orangtua saat ini . Itu hanya peringatan.shopt -s dotglob
Solusi penggunaan yang lebih baikmv home/rcook/* /home/rcook/
diikuti olehmv home/rcook/.* /home/rcook/
. Ini berhasil, meskipun saya berharap saya telah mengikuti tautan dan membaca tentang mode dotglob terlebih dahulu. Itu akan menyelamatkan saya selangkah. +1zsh
, Anda dapat menggunakan yangD
kualifikasi globbing atau yangGLOB_DOTS
opsi shell .Dalam penambahan Anda, Anda mendapat kesalahan tetapi kode masih berfungsi. Satu-satunya hal yang ditambahkan adalah bahwa Anda memberi tahu itu hanya untuk menyalin file dot. Mencoba:
Anda masih akan mendapatkan kesalahan untuk. dan .. entri, yang baik-baik saja. Tetapi langkah itu harus berhasil.
sumber
.hidden
file yang saya miliki secara eksplisit untuk menyelesaikan masalah saya.|| :
(||
berarti menjalankan yang berikut ini pada false / error,:
adalah perintah noop). Tetapi itu juga akan menekan kesalahan yang sah, misalnya folder tujuan tidak ada. Saya tidak dapat menemukan cara yang lebih eleganmv
untuk mengecualikan.
dan..
entri. Butt plus besar bagi saya lebih dari cp tidak menulis file baru ke disk.Jika Anda berada
ls -l
dalam direktori, Anda akan melihat.
dan di..
antara file-file yang terdaftar. Jadi, saya pikirmv .* /dest
memperhitungkan petunjuk itu. Mencoba:ini akan mengabaikan pointer dir saat ini dan orang tua.
Anda akan mendapatkan kesalahan jika salah satu dari tiga pola
*
,[^.]*
atau..?*
tidak cocok dengan file, jadi Anda hanya harus menyertakan yang cocok.sumber
Dua kemungkinan solusi yang bisa saya pikirkan. Yang pertama adalah menggunakan cp sebagai gantinya dengan opsi rekursif, menyalin direktori saat ini ke tujuan.
maka Anda dapat menghapus file sumber di direktori saat ini
Atau, jika Anda tahu file-file tersebut dinamai secara waras (tanpa spasi, wildcard, karakter yang tidak dapat dicetak), Anda dapat melakukan sesuatu seperti ini
sumber
-p
untuk melestarikan metadata. Penggunaanls
harus menjadi pilihan terakhir, dan di sini ada cara yang lebih baik dan lebih sederhana.Sebenarnya tidak ada yang namanya "tersembunyi" file di Linux. File yang dimulai dengan titik hanya disembunyikan dari daftar file secara default.
Untuk menyalin file bahkan dengan glob, Anda perlu awalan file dengan
.
sepertimv -u .* foo
dan kemudian.foo
akan belajar sepertifoo/.foo
ketika dipindahkan.Opsi -u hanya akan memindahkan file ketika sumber lebih baru, atau tujuan hilang. Atau Anda bisa mengabaikan kesalahan tentang memindahkan
.
dan..
karena mereka adalah file khusus dan tidak dapat dipindahkan, tetapi jangan terjebak dalam.*
glob oleh shell.sumber
Jadi kita punya:
dan:
Saya menghabiskan banyak waktu untuk menemukan solusi yang lebih baik daripada semua jawaban di sini.
Kemudian saya mengambil 30 detik untuk perintah ini:
Lalu aku menemukan cintaku:
Catatan: Saya bahkan tidak mengerti argumennya
-T
. Itu hanya melakukan apa yang saya butuhkan. Di sini tertulis:sumber
-T
. Either way ini pada dasarnya memberitahu saya untuk memindahkan direktori itu sendiri, daripada memindahkan semua file dari dalamnya.Dalam kasus saya, saya hanya mencoba
mv
satu file tersembunyi dan ini solusinya:Penjelasan
Awalnya saya mencoba:
Tapi itu terus menghasilkan kesalahan:
Meskipun
ls -al
menunjukkan bahwa file dandest/
ada.Alasannya tampaknya karena shell menafsirkan "." dalam nama file, jadi dengan memindahkannya ke variabel, ia menghindari interpretasi. Mungkin ada cara lain untuk menyelesaikan ini, tetapi ini sudah cukup bagi kami.
sumber
Jika Anda ingin menyalin file termasuk file tersembunyi ke direktori saat ini Anda berada.
sumber