Bagaimana cara memindahkan semua file dalam direktori (termasuk yang tersembunyi) ke direktori lain?
Misalnya, jika saya memiliki folder "Foo" dengan file ".hidden" dan "notHidden" di dalamnya, bagaimana cara memindahkan kedua file ke direktori bernama "Bar"? Berikut ini tidak berfungsi, karena file “.hidden” tetap berada di “Foo”.
mv Foo/* Bar/
Cobalah sendiri.
mkdir Foo
mkdir Bar
touch Foo/.hidden
touch Foo/notHidden
mv Foo/* Bar/
Jawaban yang Diterima:
Zsh
mv Foo/*(DN) Bar/
atau
setopt -s glob_dots
mv Foo/*(N) Bar/
(Tinggalkan (N)
jika Anda tahu direktori tersebut tidak kosong.)
Bash
shopt -s dotglob nullglob
mv Foo/* Bar/
Ksh93
Jika Anda tahu direktori tidak kosong:
FIGNORE='.?(.)'
mv Foo/* Bar/
Standar (POSIX) sh
for x in Foo/* Foo/.[!.]* Foo/..?*; do
if [ -e "$x" ]; then mv -- "$x" Bar/; fi
done
Jika Anda bersedia untuk membiarkan mv
perintah mengembalikan status kesalahan meskipun berhasil, jauh lebih sederhana:
mv Foo/* Foo/.[!.]* Foo/..?* Bar/
GNU temukan dan GNU mv
find Foo/ -mindepth 1 -maxdepth 1 -exec mv -t Bar/ -- {} +
Penemuan standar
Jika Anda tidak keberatan mengubah ke direktori sumber:
cd Foo/ &&
find . -name . -o -exec sh -c 'mv -- "[email protected]" "$0"' ../Bar/ {} + -type d -prune
Berikut detail selengkapnya tentang mengontrol apakah file titik cocok di bash, ksh93, dan zsh.
Bash
Setel dotglob
pilihan.
$ echo *
none zero
$ shopt -s dotglob
$ echo *
..two .one none zero
Ada juga GLOBIGNORE
yang lebih fleksibel variabel, yang dapat Anda atur ke daftar pola wildcard yang dipisahkan titik dua untuk diabaikan. Jika tidak disetel (pengaturan default), shell berperilaku seolah-olah nilainya kosong jika dotglob
diatur, dan seolah-olah nilainya adalah .*
jika opsi tidak disetel. Lihat Perluasan Nama File di manual. Direktori pervasif .
dan ..
selalu dihilangkan, kecuali .
dicocokkan secara eksplisit dengan pola.
$ GLOBIGNORE='n*'
$ echo *
..two .one zero
$ echo .*
..two .one
$ unset GLOBIGNORE
$ echo .*
. .. ..two .one
$ GLOBIGNORE=.:..
$ echo .*
..two .one
Ksh93
Setel FIGNORE
variabel. Jika tidak disetel (pengaturan default), shell berperilaku seolah-olah nilainya adalah .*
. Untuk mengabaikan .
dan ..
, mereka harus dicocokkan secara eksplisit (manual di ksh 93s+ 2008-01-31 menyatakan bahwa .
dan ..
selalu diabaikan, tetapi ini tidak menggambarkan perilaku sebenarnya dengan benar).
$ echo *
none zero
$ FIGNORE='@(.|..)'
$ echo *
..two .one none zero
$ FIGNORE='n*'
$ echo *
. .. ..two .one zero
Anda dapat menyertakan file titik dalam suatu pola dengan mencocokkannya secara eksplisit.
$ unset FIGNORE
$ echo @(*|.[^.]*|..?*)
..two .one none zero
Agar ekspansi keluar kosong jika direktori kosong, gunakan N
opsi pencocokan pola:~(N)@(*|.[^.]*|..?*)
atau ~(N:*|.[^.]*|..?*)
.
Zsh
Setel dot_glob
pilihan.
% echo *
none zero
% setopt dot_glob
% echo *
..two .one none zero
.
dan ..
tidak pernah cocok, meskipun polanya cocok dengan .
secara eksplisit.
% echo .*
..two .one
Anda dapat menyertakan file titik dalam pola tertentu dengan D
kualifikasi glob.
% echo *(D)
..two .one none zero
Tambahkan N
glob qualifier untuk membuat ekspansi keluar kosong di direktori kosong:*(DN)
.
Catatan:Anda mungkin mendapatkan hasil perluasan nama file dalam urutan yang berbeda
(mis., none
diikuti oleh .one
diikuti oleh ..two
)
berdasarkan setelan LC_COLLATE
, LC_ALL
, dan LANG
variabel.