GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara memindahkan semua file dari direktori saat ini ke direktori atas?

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

Linux
  1. Cara Menemukan File Di Linux Di Semua Direktori Secara Rekursif

  2. Bagaimana Memindahkan Semua File (termasuk Tersembunyi) Dari Satu Direktori Ke Yang Lain?

  3. Bagaimana Cara Memindahkan 100 File Dari Folder Yang Berisi Ribuan?

  1. Cetak Semua File Dalam Folder?

  2. Bagaimana cara memindahkan (dan menimpa) semua file dari satu direktori ke direktori lain?

  3. Bagaimana mengubah semua kemunculan kata di semua file dalam direktori

  1. Bagaimana cara menggunakan Wget untuk mengunduh file secara rekursif dari direktori web?

  2. Bagaimana cara chown/chmod semua file di direktori saat ini?

  3. Cara memindahkan semua file dan folder melalui perintah mv