Saya mencoba mengumpulkan semua file di bawah direktori saat ini dan semua subdirektori ke satu direktori. Saya mencoba sesuatu seperti yang berikut ini
find -type f -exec mv {} collection/{} \;
perintah di atas tidak akan berfungsi karena yang kedua {}
memberikan path lengkap, bagaimana saya bisa mengumpulkan semua file?
command-line
find
Kelinci
sumber
sumber
-maxdepth 1
akan membantu.find -type f -print0|xargs -0r mv -it colection/
Alih-alih menggunakan
find
(yang melakukan pekerjaan dengan baik), Anda juga bisa menggunakan shell untuk tujuan ini.Katakan Anda ingin semua file dari $ PWD ke $ DEST. Upaya alami adalah:
Bagaimana cara kerjanya? Ekspresi "$ PWD / *" meluas ke nama semua file dalam direktori itu. Fitur shell ini disebut "globbing". Argumen terakhir
mv
adalah direktori tujuan. Jika Anda memiliki banyak file, ini tidak akan berfungsi karena panjang baris perintah terbatas.Tetapi solusinya memiliki masalah bahwa ia menghapus file dot - atau "tersembunyi" file, file dan direktori yang namanya dimulai dengan ".". Untuk mengatasi ini, Anda harus memberi tahu shell Anda untuk menyertakan dotfiles saat globbing. Untuk melakukan ini, gunakan
saat menggunakan
bash
(dan Anda mungkin menggunakanbash
kecuali Anda telah mengubah default). Dalam shell ini, perintah di atas akan berfungsi untuk dotfile juga.Selain itu, di
zsh
, Anda memiliki opsi untuk memilih ini berdasarkan kasus per kasus. Untuk melakukan ini, masukkandi Anda
.zshrc
. Maka Anda bisa menggunakannyauntuk memindahkan semua file, termasuk dotfiles. ("D" memiliki efek mengaktifkan sementara opsi "GLOB_DOTS").
Sekarang pertanyaan awal adalah memindahkan semua file biasa (bukan direktori) dari semua subdirektori dan subdirektori ke satu direktori. Ini dapat dilakukan dengan
zsh
:Di sini ungkapan
**/*
membuat globber turun secara rekursif ke subdirektori. TheD
berarti "juga pilih dotfiles', yang.
berarti 'hanya memilih file biasa, bukan direktori'.sumber
find -type f -exec mv -t collection/ {} +
. Lihat halaman buku panduan tentang cara kerjanya.