it-swarm-id.com

Bagaimana Anda memindahkan semua file (termasuk tersembunyi) dari satu direktori ke direktori lainnya?

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 dalam, bagaimana cara memindahkan kedua file ke direktori bernama "Bar"? Berikut ini tidak berfungsi, karena file ".hidden" tetap di "Foo".

mv Foo/* Bar/

Cobalah sendiri.

mkdir Foo
mkdir Bar
touch Foo/.hidden
touch Foo/notHidden
mv Foo/* Bar/
155
Cory Klein

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 tersebut 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 ingin membiarkan perintah mv mengembalikan status kesalahan meskipun berhasil, itu jauh lebih sederhana:

mv Foo/* Foo/.[!.]* Foo/..?* Bar/

GNU menemukan dan GNU mv

find Foo/ -mindepth 1 -maxdepth 1 -exec mv -t Bar/ -- {} +

Temuan 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 ini lebih detail tentang cara mengontrol apakah file dot cocok dengan bash, ksh93 dan zsh.

Bash

Setel opsi dotglob .

$ echo *
none zero
$ shopt -s dotglob
$ echo *
..two .one none zero

Ada juga variabel GLOBIGNORE yang lebih fleksibel , yang dapat Anda atur ke daftar pola wildcard yang dipisahkan oleh usus 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 Ekspansi Nama File dalam manual. Direktori meresap . Dan .. Selalu dihilangkan, kecuali . Dicocokkan secara eksplisit oleh pola.

$ GLOBIGNORE='n*'
$ echo *
..two .one zero
$ echo .*
..two .one
$ unset GLOBIGNORE
$ echo .*
. .. ..two .one
$ GLOBIGNORE=.:..
$ echo .*
..two .one

Ksh93

Setel variabel FIGNORE . Jika tidak disetel (pengaturan default), Shell berperilaku seolah-olah nilainya adalah .*. Untuk mengabaikan . Dan .., Mereka harus dicocokkan secara eksplisit (manual dalam ksh 93s + 2008-01-31 menyatakan bahwa . Dan .. Selalu diabaikan , tetapi ini tidak dengan benar menggambarkan perilaku aktual).

$ echo *
none zero
$ FIGNORE='@(.|..)'
$ echo *
..two .one none zero
$ FIGNORE='n*'
$ echo *
. .. ..two .one zero

Anda dapat memasukkan file dot dalam pola dengan mencocokkannya secara eksplisit.

$ unset FIGNORE
$ echo @(*|.[^.]*|..?*)
..two .one none zero

Agar ekspansi keluar kosong jika direktori kosong, gunakan opsi N pencocokan pola: ~(N)@(*|.[^.]*|..?*) atau ~(N:*|.[^.]*|..?*).

Zsh

Setel opsi dot_glob .

% echo *
none zero
% setopt dot_glob
% echo *
..two .one none zero

. Dan .. Tidak pernah cocok, bahkan jika polanya cocok dengan yang terkemuka . Secara eksplisit.

% echo .*
..two .one

Anda dapat menyertakan file dot dalam pola tertentu dengan Dkualifikasi glob .

% echo *(D)
..two .one none zero

Tambahkan N glob kualifikasi untuk membuat ekspansi keluar kosong di direktori kosong: *(DN).


Catatan: Anda bisa mendapatkan hasil ekspansi nama file dalam pesanan yang berbeda (mis., none diikuti oleh .one Diikuti oleh ..two) Berdasarkan pada pengaturan Anda pada LC_COLLATE, LC_ALL, Dan LANG variabel.

#!/bin/bash

shopt -s dotglob
mv Foo/* Bar/

Dari man bash

dotglob Jika diset, bash menyertakan nama file yang diawali dengan '.' dalam hasil ekspansi pathname.

24
SiegeX

Cara sederhana untuk melakukan ini dalam bash adalah

mv {Foo/*,Foo/.*} Bar/

Tetapi ini juga akan memindahkan direktori.

Jika Anda ingin memindahkan semua file termasuk tersembunyi tetapi tidak ingin memindahkan direktori apa pun, Anda dapat menggunakan for for dan uji.

for i in $(ls -d {Foo/*,Foo/.*});do test -f $i && mv -v $i Bar/; done;

11
Boris Month

Salah satu caranya adalah dengan menggunakan find:

find Foo/ -type f -exec mv -t Bar/ {} \+

-type f membatasi perintah find untuk menemukan file. Anda harus menyelidiki -type, -maxdepth, dan -mindepth pilihan find untuk menyesuaikan perintah Anda ke akun untuk subdirektori. Temukan memiliki panjang tapi sangat membantu halaman manual .

4
Steven D

Coba perintah salin cp:

$ cp -r myfolder/* destinationfolder

cp -r Berarti menyalin rekursif, sehingga semua folder dan file akan disalin.

Anda dapat menggunakan perintah hapus rm untuk menghapus folder:

$ rm -r myfolder

Lihat lebih banyak: pindahkan semua file dari direktori ke yang lain .

2
ucefkh

Untuk distro Linux minimal , berikut ini harus berfungsi. Pertama, lakukan pemindahan dasar semua (yang merindukan file tersembunyi). Kemudian, pindahkan semua file yang disembunyikan (termasuk . dan .. yang akan tidak benar-benar dipindahkan).

mv /sourceDir/* /destinationDir 2> /dev/null
mv /sourceDir/.* /destinationDir 2> /dev/null

Catatan: Jika tidak ada konten yang terlihat, perintah pertama akan menghasilkan pesan kesalahan. Perintah kedua akan selal menghasilkan kesalahan yang mengatakan itu tidak bisa bergerak . dan ... Dengan demikian, cukup kirimkan kesalahan ke /dev/null (seperti yang ditunjukkan).

Jika Anda membutuhkan ini sebagai satu-liner, cukup gabungkan dengan semi-kolon:

mv /sourceDir/* /destinationDir 2> /dev/null; mv /sourceDir/.* /destinationDir 2> /dev/null
1
BuvinJ

Rsync adalah opsi lain:

rsync -axvP --remove-source-files sourcedirectory/ targetdirectory

Ini bekerja karena dalam rsync trailing slash penting, sourcedirectory/ merujuk ke isi direktori, sementara sourcedirectory akan merujuk ke direktori itu sendiri.

Kerugian dari metode ini adalah rsync hanya akan membersihkan file setelah pindah, bukan direktori. Jadi Anda dibiarkan dengan pohon direktori sumber kosong. Untuk pemecahannya, lihat:

Memindahkan file dan menghapus direktori dengan rsync?

Jadi, walaupun ini mungkin tidak optimal untuk memindahkan operasi, ini bisa sangat berguna untuk operasi penyalinan.

1
Grumbel

Jawaban untuk pesta/ikan

Berikut cara untuk melakukannya menggunakan wildcard:

.[!.]* ..?* akan cocok semua file tersembunyi kecuali . dan ..

.[!.]* ..?* * akan cocok semua file (disembunyikan atau tidak) kecuali . dan ..

Dan untuk menjawab contoh khusus dari pertanyaan ini Anda perlu cd foo && mv .[!.]* ..?* * ../bar

Penjelasan

.[!.]* cocok dengan nama file yang dimulai dengan satu titik, diikuti oleh karakter apa pun kecuali titik secara opsional diikuti oleh string apa pun. Ini cukup dekat tetapi merindukan file dimulai dengan dua titik seperti ..foo. Untuk memasukkan file seperti itu kami tambahkan ..?* yang cocok dengan nama file yang dimulai dengan dua titik, diikuti oleh karakter apa pun, secara opsional diikuti oleh string apa pun.

ji

Anda dapat menguji wildcard ini dengan perintah di bawah ini. Saya sudah mencoba mereka dengan sukses di bawah bash dan ikan. Mereka gagal di bawah sh, zsh, xonsh.

mkdir temp
cd temp
touch  a  .b  .bc  ..c  ..cd  ...d  ...de
ls .[!.]* ..?*
# you get this output:
          .b  .bc  ..c  ..cd  ...d  ...de
# cleanup
cd ..
rm -rf temp
1
ndemou

Saya menemukan bahwa ini bekerja dengan baik untuk bash dan tidak perlu mengubah opsi Shell

mv sourcedir/{*,.[^.]*} destdir/

EDIT:

Jadi seperti yang dikatakan G-man, jawaban asli saya tidak sesuai dengan posix dan hampir sama dengan jawaban ndemou di atas dengan satu perubahan, yaitu menggunakan ekspansi brace untuk membuat daftar string yang kemudian ditindaklanjuti. Ini berarti Anda tidak perlu cd ke direktori sumber. Sebenarnya bukan perubahan yang besar, tetapi berbeda.

contoh: katakanlah Anda sudah memiliki tata letak berikut.

 $ tree -a
.
├── destdir
└── sourcedir
    ├── ..d1
    ├── ..d2
    ├── ..double
    ├── file-1
    ├── file-2
    ├── .hidden-1
    ├── .hidden-2
    ├── ...t1
    └── ...t2

Pertanyaan awal hanya menyebutkan file tersembunyi dengan satu periode, tetapi katakanlah ada beberapa dengan dua atau lebih periode di awal nama. Anda bisa menambahkan ekspresi tambahan ke dalam kurung kurawal. Kami kemudian dapat mengeksekusi

mv sourcedir/{*,.[!.]*,..?*} destdir/

Ini akan diperluas ke yang berikut:

mv sourcedir/file-1 sourcedir/file-2 sourcedir/.hidden-1 sourcedir/.hidden-2 sourcedir/..d1 sourcedir/..d2 sourcedir/..double sourcedir/...t1 sourcedir/...t2 destdir/

Anda sekarang akan melihat semua file yang terletak di destdir :

 $ tree -a
.
├── destdir
│   ├── ..d1
│   ├── ..d2
│   ├── ..double
│   ├── file-1
│   ├── file-2
│   ├── .hidden-1
│   ├── .hidden-2
│   ├── ...t1
│   └── ...t2
└── sourcedir

Anda dapat melakukan beberapa hal keren dengan kawat gigi di bash dengan tambahan lebih banyak lagi di 4.x. Lihat bash-hacker untuk beberapa contoh bagus.

0
cmndr sp0ck

Anda mungkin juga dapat menemukan dan menerima backquotes untuk memilih file untuk perintah pindah. Pindahkan itu ke mv.

Yaitu. Untuk file tersembunyi

find Foo -maxdepth 1 | egrep '^Foo/[.]' # Output: .hidden

Begitu

mv `find Foo -maxdepth 1 | egrep '^Foo/[.]'` Bar # mv Foo/.hidden Bar

Memindahkan hanya file tersembunyi yang dipilih ke Bar:

mv `find Foo -maxdepth 1 | egrep '^Foo/.'` Bar # mv Foo/.hidden Foo/notHidden Bar

Memindahkan semua file di Foo ke Bar sejak '.' dalam perintah egrep bertindak sebagai wildcard tanpa tanda kurung.

^ karakter memastikan pertandingan dimulai dari awal baris.

Beberapa detail egrep pencocokan pola dapat ditemukan di sini .

Menggunakan maxdepth 1 berhenti mencari dari masuk ke subdirektori.

0
user3192145

Terinspirasi dari jawaban ini :

Tanpa menyalin file ...

rsync -ax --link-dest=../Foo/ Foo/ Bar

Peringatan:

  • --link-dest path harus absolut atau relatif terhadap DESTINATION (Bar dalam contoh)

  • Anda harus meletakkan / setelah SUMBER (Foo/ dalam contoh), jika tidak maka akan menyalin folder SOURCE alih-alih kontennya.

0
palindrom