Bagaimana memindahkan semua file (termasuk tersembunyi) secara rekursif ke subfolder ke folder induk di * nix?

14

Ini sedikit pertanyaan yang memalukan, tetapi saya harus mengakui bahwa di akhir karir saya ini saya masih memiliki pertanyaan tentang perintah mv.

Saya sering mengalami masalah ini: Saya perlu memindahkan semua file secara rekursif naik satu tingkat. Katakanlah saya memiliki folder foo, dan bilah folder di dalamnya. Bar memiliki kekacauan file dan folder, termasuk file dot dan folder. Bagaimana cara memindahkan semua yang ada di bar ke level foo?

Jika foo kosong, saya cukup memindahkan bilah satu tingkat di atas, menghapus foo dan mengganti nama bilah ke foo. Bagian dari masalah adalah bahwa saya tidak tahu apa wildcard mv untuk "semuanya termasuk titik". Bagian dari pertanyaan ini adalah ini - apakah ada diskusi mendalam tentang wildcard yang digunakan perintah cp dan mv di suatu tempat (googling ini hanya membawa tutorial yang sangat mendasar).

deadprogrammer
sumber

Jawaban:

19

Di Bash (dan beberapa lainnya), Anda bisa menggunakan brace expansion untuk mencapai ini dalam satu baris:

mv bar/{,.}* .

Koma memisahkan nol dan titik, sehingga mvperintah melihat nama file yang cocok *dan.*

Dijeda sampai pemberitahuan lebih lanjut.
sumber
ini mencoba untuk memindahkan '..' juga, gagal dengan pesan 'resource is busy'. Tetap bekerja.
Xananax
3
Disarankan oleh pengguna anonim:To eliminate the error caused by also matching "." and "..", use this command: mv bar/{,.[!.],..?}* .
HopelessN00b
2

Cara termudah untuk melakukan ini adalah melakukannya dalam dua perintah, karena * tidak cocok. Apa pun

cd /foo
mv bar/* ./
mv bar/.??* ./

Anda tidak ingin menggunakan bilah /.* yang saya temukan saat melakukan kesalahan ini:

rm -rf ./.* 

Ini adalah hal yang buruk. Adakah yang mau menebak kenapa? ;-)

Matt Simmons
sumber
Saya tidak berpikir Bash atau Zsh mengembang .*ke .dan ... Zsh setidaknya tidak untukku.
Mikael S
Mikael: Saya bisa berjanji bahwa bash melakukannya (atau setidaknya melakukannya), karena saya harus memulihkan direktori pengguna yang saya hapus dengan melakukan hal itu
Matt Simmons
2

Hal pertama yang harus diketahui tentang globbing - ini dilakukan oleh shell, bukan perintah. Periksa halaman manual shell Anda untuk semua detailnya.

Jeff Leyser
sumber
2

Yang ini memanen semua file dari subfolder dan memindahkannya ke direktori saat ini

find . -type f -exec mv -iv \{} . \;

Jika Anda ingin menulis file dengan nama yang sama, gunakan

yes y | find . -type f -exec mv -iv \{} . \;
michelek
sumber
1

mv .??* *akan mengurus apa pun kecuali titik diikuti oleh satu karakter. Jika itu biasa untuk situasi Anda, Anda dapat menambahkan .[a-zA-Z0-9]*. Yang masih akan meninggalkan file dengan nama-nama seperti .;, .^, dan .^I(tab). Jika Anda perlu menangani semuanya, Anda harus sedikit lebih rumit.

mv .. `ls -f | egrep -v '^.$|^..$'
mpez0
sumber
0

Jika Anda memiliki struktur direktori /foo/bar/dan Anda ingin memindahkan semua file dalam barsatu langkah di atas, buka bardirektori dan ketik berikut ini:

find . -depth -print0 | cpio --null -pvd ../

Secara umum, saya pikir cpio(1)lebih baik untuk tugas semacam ini. Anda dapat melihat dokumentasi terperinci dengan menerbitkan info cpiodi shell Anda.

fim
sumber