Perintah yang Anda cari adalah
mv * .[^.]* ..
atau (lihat di bawah untuk info lebih lanjut):
(shopt -s dotglob; mv -- * ..)
Penjelasan:mv
perintah memindahkan file dan direktori. Argumen terakhir untuk mv
adalah target (dalam hal ini direktori satu langkah "naik" di pohon, ..
). Argumen sebelumnya adalah file sumber dan direktori. Tanda bintang (*
) adalah wildcard yang cocok dengan semua file yang tidak dimulai dengan titik. File yang dimulai dengan titik (dotfiles) "tersembunyi". Mereka dicocokkan menggunakan pola .[^.]*
(lihat edit di bawah).
Lihat halaman manual yang saya tautkan untuk informasi lebih lanjut tentang mv
.
Mengapa .[^.]*
bukannya .*
?
Seperti yang ditunjukkan dengan benar oleh Chris Johnsen:pola .*
juga cocok dengan .
dan ..
. Karena Anda tidak ingin (dan tidak bisa) memindahkannya, sebaiknya gunakan pola yang cocok dengan nama file apa pun yang dimulai dengan titik kecuali keduanya . Pola .[^.]*
tidak hanya itu:cocok dengan nama file apa saja (1) dimulai dengan titik (2) diikuti dengan karakter yang bukan titik (3) diikuti oleh nol atau beberapa karakter arbitrer.
Seperti yang ditunjukkan Paggas, kita juga harus menambahkan pola .??*
untuk mencocokkan file yang dimulai dengan dua titik. Lihat jawabannya untuk solusi alternatif menggunakan find
.
Jawaban Arjan menyebutkan shopt
untuk menghindari semua masalah dengan dotfiles. Namun masih ada masalah dengan file yang dimulai dengan tanda hubung. Dan itu membutuhkan tiga perintah. Tetap saja, saya suka ide itu. Saya mengusulkan untuk menggunakannya seperti ini:
(shopt -s dotglob; mv -- * ..)
Ini mengeksekusi shopt
dalam subkulit (sehingga tidak ada panggilan kedua ke shopt
wajib) dan menggunakan --
sehingga file yang dimulai dengan tanda hubung tidak akan ditafsirkan sebagai argumen untuk mv
.
Jawaban singkat:gunakan
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
Jawaban panjang:
Perintah
mv * .* ..
tidak akan berfungsi sejak .*
dapat cocok dengan .
dan ..
. Tapi perintahnya
mv * .[^.]* ..
juga tidak akan berfungsi, karena .[^.]*
tidak akan cocok, mis., ..filename
! Sebaliknya, yang saya lakukan adalah
mv * .[^.] .??* ..
yang akan cocok dengan semuanya kecuali .
dan ..
. *
akan cocok dengan semua yang tidak dimulai dengan .
, .[^.]
akan cocok dengan semua nama file 2 karakter yang dimulai dengan titik kecuali ..
, dan .??*
akan cocok dengan semua nama file yang dimulai dengan titik dengan minimal 3 karakter.
Lebih baik lagi, Anda dapat menggunakan
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
yang menghindari peretasan glob yang jelek di mv * .[^.] .??* ..
!
Demi kelengkapan, seseorang juga dapat memberi tahu Bash shell untuk menyertakan file tersembunyi, menggunakan shopt
:
shopt -s dotglob
mv -- * ..
shopt -u dotglob