Alasannya karena di bash
, *
tidak termasuk file yang dimulai dengan titik (.
).
Anda dapat menjalankan
cp A/.* B
Ini akan memperingatkan Anda bahwa itu tidak menyalin .
atau ..
, atau subdirektori apa pun, tetapi ini baik-baik saja.
Atau, jika Anda ingin menyalin file dot dan file normal secara bersamaan, jalankan
cp A/.* A/* B
Anda juga bisa menjalankan
shopt -s dotglob
cp A/* B
yang akan bekerja di bash
, tetapi bukan sh
.
Dan jika Anda tidak keberatan subdirektori juga disalin, maka ini yang paling mudah:
cp -R A/ B
Kiat:Jika karakter pengganti tidak berfungsi seperti yang Anda harapkan, coba jalankan dengan gema, mis.
$ echo A/*
A/file1 A/file2
$ echo A/.*
A/. A/.. A/.hidden1 A/.hidden2
$ echo A/.* A/*
A/. A/.. A/.hidden1 A/.hidden2 A/file1 A/file2
$ shopt -s dotglob
$ echo A/*
A/file1 A/file2 A/.hidden1 A/.hidden2
Jika bash, Anda dapat mengatur dotglob
sebelum Anda menyalin
shopt -s dotglob
cp A/* /destination
Atau bahasa pemrograman
$ ruby -rfileutils -e 'Dir[".*"].each {|x| FileUtils.copy(x,"/destination") if File.file?x}'
Jika Anda tidak ingin menyetel dotglob, cukup
cp A/.* /destination 2>/dev/null
Apa yang Anda cari lebih sesuai dengan:
cp A/.??* B/
Ini akan cocok dengan semua file dot, tetapi bukan "." atau "..". Sebagian besar solusi di atas baik-baik saja selama Anda tidak bekerja secara rekursif. Tetapi segera setelah Anda ingin melakukan sesuatu seperti:
cp -R A/.??* B/
Tanpa menghilangkan ".." Anda akan menyalin semuanya dari direktori induk ke bawah, termasuk file non-dot.