Bagaimana cara memindahkan semua file dari direktori saat ini ke direktori teratas di linux?
Saya mencoba sesuatu seperti mv *.*
, tetapi tidak berhasil.
Bagaimana cara memindahkan semua file dari direktori saat ini ke direktori teratas di linux?
Saya mencoba sesuatu seperti mv *.*
, tetapi tidak berhasil.
Jawaban:
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 mv
adalah target (dalam hal ini direktori satu langkah "naik" di pohon, ..
). Argumen sebelum itu 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) "disembunyikan". Mereka dicocokkan menggunakan pola .[^.]*
(lihat edit di bawah).
Lihat halaman yang saya tautkan untuk informasi lebih lanjut tentang mv
.
.[^.]*
bukannya .*
?Seperti yang ditunjukkan dengan benar oleh Chris Johnsen : polanya .*
juga cocok .
dan ..
. Karena Anda tidak ingin (dan tidak bisa) memindahkannya, lebih baik menggunakan pola yang cocok dengan nama file apa pun yang dimulai dengan titik kecuali keduanya . Pola .[^.]*
tidak hanya itu: cocok dengan nama file (1) dimulai dengan titik (2) diikuti oleh karakter yang bukan titik (3) diikuti oleh nol atau lebih karakter sewenang-wenang.
Sebagai Paggas menunjukkan , kami 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 dotfile. Tapi kemudian 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 dijalankan shopt
dalam subshell (sehingga tidak perlu panggilan kedua shopt
) dan menggunakan --
sehingga file yang dimulai dengan tanda hubung tidak akan ditafsirkan sebagai argumen mv
.
.*
mungkin menyebabkan mv menghasilkan peringatan / kesalahan tentang tidak bisa bergerak .
dan ..
. Anda mungkin mencoba mv * .[^.]* ..
sebagai gantinya.
*
, .[^.]*
dan ..?*
. Yang kedua mungkin .[!.]*
untuk shell yang lebih lama (POSIX). Baca juga
Jawaban singkat: gunakan
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
Jawaban panjang:
Perintah
mv * .* ..
tidak akan berfungsi karena .*
dapat mencocokkan .
dan ..
. Tapi perintahnya
mv * .[^.]* ..
juga tidak akan berfungsi, karena .[^.]*
tidak akan cocok, misalnya ..filename
,! Sebaliknya, yang saya lakukan adalah
mv * .[^.] .??* ..
yang akan cocok dengan semuanya kecuali .
dan ..
. *
akan cocok dengan semua yang tidak dimulai dengan a .
, .[^.]
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 setidaknya 3 karakter.
Lebih baik lagi, Anda bisa menggunakannya
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
yang menghindari gumpalan jelek di mv * .[^.] .??* ..
!
..?*
komentar saya, dan Anda sudah menanganinya.
mv
untuk berhenti mencari opsi perintah lebih lanjut. Kawat gigi adalah nama file yang dihasilkan. Tanda plus mengatakan alih-alih menjalankan exec per hasil (mis. Per nama file), letakkan sebanyak mungkin hasil dalam satu exec sebanyak mungkin. Untuk kelengkapannya, -t..
katakan memindahkan tujuan tujuan untuk memindahkan semua file-file ini.
Hanya demi kelengkapan, Anda juga dapat memberi tahu Bash shell untuk memasukkan file tersembunyi, menggunakan shopt
:
shopt -s dotglob
mv -- * ..
shopt -u dotglob
Mv tidak memiliki fungsionalitas memindahkan file tersembunyi saat menggunakan *
- jadi mengapa tidak menggunakan salin saja?
cp -rf . ..
rm -rf *
Tidak perlu masuk ke solusi kompleks dotglobbing dan menggunakan perintah find.
rsync -a --remove-source-files . ..
rsync
adalah alat penyalinan file yang sangat kuat, umumnya digunakan untuk melakukan backup dan mirror jarak jauh inkremental yang efisien.
Dengan perintah di atas, kami menyuruh rsync
menyalin konten .
ke..
Switch -a
memungkinkan rekursi menjadi .
subdirektori dan memungkinkan beberapa opsi umum lainnya.
Switch --remove-source-files
memberitahu rsync untuk menghapus file sumber setelah salinan berhasil, yaitu itu membuat rsync berperilaku serupa dengan mv
perintah.
--remove-source-files
tidak akan menghapus direktori (disinkronkan).
-bash: /bin/mv: Argument list too long
kesalahan. Yang ini berfungsi seperti pesona.
Pada akhirnya mencoba mv .
akan gagal karena mv tidak akan dapat memutuskan tautan direktori yang sedang Anda mv * ..
masuki. Anda dapat memindahkan file di cwd.
mv * .??* ../.
*
mendapat semua file bukan-titik. .??*
dapatkan semuanya. file setidaknya tiga byte, yang berfungsi untuk semua yang sah. Sesuatu yang tersisa Anda mungkin ingin rm
bukan mv
pula.
Itu ../.
tidak menawarkan manfaat langsung ..
tetapi ketika melakukan pindah-ke-direktori itu adalah kebiasaan yang sangat baik untuk masuk, karena akan gagal, seperti yang Anda inginkan, jika ada sesuatu yang salah dengan jalan. Misalnya, di mv xyz bletch
mana Anda pikir bletch
adalah direktori, dapat dibuat lebih pasti mv xyz bletch/.
.
.[^.]
untuk mendapatkan file sampul seperti .a
.
Perintah yang diperkecil ini berfungsi pada sebagian besar shell modern:
\mv -- {,.{[^.],??}}* ..
Jika tidak disebutkan adalah solusi portabel:
\mv -- * .[^.] .??* ..
Fitur:
\ Mencegah alias mengubah mv yang tidak diinginkan.
- Mencegah nama file yang mengandung tanda hubung (-xyz) dari ditafsirkan sebagai argumen baris perintah.
. [^.] cocok dengan semua nama file dua karakter yang diawali dengan. kecuali ..
. ?? * cocok dengan semua nama file lainnya, tiga karakter atau lebih lama.
Implementasi Naif:
Melewati berikut ini menyembunyikan nama file UNIX, yang diawali dengan. (.bashrc).
mv * ..
Pencocokan berikut .. yang secara rekursif mencoba untuk memindahkan setiap direktori pada akhirnya semua jalan kembali ke / ke .. direktori kerja saat ini ($ PWD atau pwd). Jangan pernah gunakan.
mv .* ..
Lebih tepat menggunakan pola * .[!.] .??*
daripada * .[^.] .??*
karena yang pertama juga akan bekerja dengan cangkang yang lebih lama seperti ksh88:
mv -- * .[!.] .??* ..
--
mencegah masalah ketika Anda memiliki nama file yang dimulai dengan -
*
cocok dengan semua nama file yang tidak dimulai dengan a .
.
yang Anda dapat / harus pindah.[!.]
cocok dengan kedua nama file karakter yang dimulai dengan a .
.??*
cocok dengan ketiga nama file karakter (atau lebih panjang) yang dimulai dengan a .
Dengan ksh88, pola nama file .[^.]
sebenarnya akan cocok dengan nama file ..
(yang selalu ada) dan .^
(yang mungkin tidak ada), memiliki efek yang berlawanan dengan apa yang diinginkan.
Temukan dan dapatkan pekerjaan juga. Struktur semacam ini mungkin berguna jika Anda ingin memilih file pada kriteria yang lebih rumit dengan memodifikasi find dan egrep.
find -maxdepth 1 | egrep '^./.' # Returns all files
mv `find -maxdepth 1 | egrep '^./.'` .. # mv <all files> ..
Saya pikir solusi termudah untuk memindahkan semua file ke dir induknya. akan menjadi
mv "`ls`" ../
atau, Jika ada file / direktori tersembunyi
menggunakan:
mv "`ls -a`" ../ 2>/dev/null
Juga, katakanlah Anda ingin memindahkan konten beberapa folder ke salah satu folder internal tony (katakanlah)
menggunakan:
mv "`ls -a`" /tony 2>/dev/null
catatan:
"`ls -a`"
Untuk memindahkan file yang memiliki spasi di dalamnya.
2>/dev/null
Apakah untuk menekan peringatan / error karena ls -a
akan mencetak .
dan ..
folder juga dan Anda tidak dapat memindahkan atau menyalinnya. Jadi untuk folder-folder itu akan muncul kesalahan (jika kita tidak menggunakan 2> / dev / null) bahwa itu tidak dapat memindahkan mereka dan sisanya akan dipindahkan dengan nyaman.
Terbaik untuk menghindari ls -a
jika tidak ada file tersembunyi dan cukup gunakan ls
.
mv $(ls -a)
? Itu akan mengetuk direktori saat ini dan direktori di bawahnya, karena ls -a
akan menampilkan ..
juga.
mv ls -a ../
akan juga bekerja sesuai kebutuhan, Ya itu akan menunjukkan kesalahan-kesalahan seperti yang saya sebutkan di atas tetapi selain itu akan memindahkan folder / file yang diperlukan ke dir induk.
ls
perintah untuk memindahkan file dengan spasi. Saya telah melakukan perubahan yang diperlukan. Terima kasih telah menunjukkan.
[linux] [mv] [cwd] [files]
, atau yang serupa?