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:
mv $PWD/* $DEST
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
shopt -s dotglob
saat menggunakan bash
(dan Anda mungkin menggunakan bash
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, masukkan
setopt extendedglob
di Anda .zshrc
. Maka Anda bisa menggunakannya
mv $PWD/*(D) $DEST
untuk 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
:
mv $PWD/**/*(D.)
Di sini ungkapan **/*
membuat globber turun secara rekursif ke subdirektori. The D
berarti "juga pilih dotfiles', yang .
berarti 'hanya memilih file biasa, bukan direktori'.