Bagaimana cara memindahkan semua file dalam folder saat ini ke subfolder?


70

Saya di jalan:

/myuser/downloads/

Dan saya membuat sub folder:

/myuser/downloads/new

Sekarang saya ingin memindahkan semua file dan folder / sub-folder di folder unduhan ke sub-folder.

bagaimana saya bisa melakukan ini?

Saya mencoba:

mv -R *.* new/

Tetapi bergerak tidak mengambil -R switch sepertinya.


4
Anda tidak perlu -R. Hanya mv * newMeskipun, itu akan merengek "tidak bisa bergerak baru untuk baru" atau yang serupa. Mungkin mv -i * newbagi Anda mencegah overwrites.

Jawaban:


101

Perintah

mv !(new) new

harus melakukan trik. Jika tidak berhasil, jalankan shopt -s extglobterlebih dahulu.

Untuk juga memindahkan file / direktori tersembunyi (yang diawali dengan titik), jalankan juga shopt -s dotglobterlebih dahulu.
Jadi, untuk meringkas:

shopt -s extglob dotglob
mv !(new) new
shopt -u dotglob

(Selalu lebih baik tidak disetel dotglobuntuk menghindari kejutan buruk).


5
dapatkah Anda menyebutkan apa pentingnya !(something)?
Adeerlike

2
@ pengirim yang hanya mengatakan tidak (sesuatu). Dengan kata lain, salin semuanya tetapi bukan sesuatu. Jelas seperti lumpur?
RockyMountainHigh

4
sangat. apakah Anda mengetahui persamaan untuk zsh?
Seperti Adeer

1
Saya tidak mengerti, misal apa. Jika saya mencoba memindahkan konten folder devke lokasi saya saat ini, apakah saya harus menjalankannya mv !(dev) dev?? Saya mendapatkan-bash: !: event not found
Hitam

5
@adeer sangat mirip. setopt extendedglobuntuk mengatur mode glob diperpanjang di zsh. ^adalah simbol pengecualian, jadi mv ^new newakan melakukan trik. kemudian untuk melihat semua opsi yang diatur dalam zsh yang dapat Anda gunakan setoptdan untuk menonaktifkan mode glob diperpanjang yang dapat Anda lakukanunsetopt extendedglob
Mr. T

10

Saya menemukan sesuatu seperti ini tetapi sedikit lebih mudah untuk dipahami, dan itu mungkin bekerja dengan baik untuk Anda juga:

ls | grep -v new | xargs mv -t new

Menambahkan penjelasan ke solusi di atas:

Dari halaman manual:

  • mv -t

    -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY
    
  • grep -v

    -v, --invert-match
          Invert the sense of matching, to select non-matching lines.
    

Dijelaskan dengan langkah:

  • ls akan mencantumkan file dalam direktori saat ini
  • grep -v new akan kembali disalurkan ke yang tidak cocok baru
  • xargs mv -t newakan memindahkan file yang disalurkan ke dari dari grep -vke direktori target

Saya mencoba metode ini, tetapi saya mendapatkan: mv: illegal option -- t. Apakah ini karena saya menggunakan zsh?
ConstantFun

@ConstantFun Bisa zsh tapi saya rasa ini adalah implementasi Anda mv, (artinya versi mv Anda berbeda dengan apa yang saya gunakan) os apa yang Anda gunakan? Saya percaya ketika saya menulis jawaban ini saya centosmenggunakan distro linux bash.
lockwobr

2
Hanya menguji ini pada osx dan saya mendapatkan kesalahan mv: illegal option -- tyang sama karena osx's mv tidak memiliki -topsi.
lockwobr

1
(Saya belum mencoba ini, dan tidak berencana untuk itu.) Tautan ini apple.stackexchange.com/questions/69223/… memberi tahu Anda cara menginstal gnucore yang akan membantu Anda mendapatkan gnucore cli utils, osx dikirimkan dengan bsd alat CLI yang berbeda dengan yang datang dengan linux.
lockwobr

Saya menggunakan OSX zsh, jadi mungkin saja OSnya ..? Terima kasih telah mengklarifikasi!
ConstantFun

7

Ide sederhana. Dengan asumsi Anda berada di / myuser , ganti nama unduhan menjadi baru , buat direktori unduhan baru kemudian pindahkan baru ke dalamnya.

mv downloads new # downloads is now called new
mkdir downloads # create new directory downloads
mv new downloads # move new into it.

1

Jika Anda ingin memindahkan semua file dari folder ke salah satu subfoldernya, Anda dapat menggunakan perintah berikut:

find /myuser/downloads/ -type d -name 'new' -prune -type f | xargs mv -t /myuser/downloads/new

Ini akan menemukan semua file dan kemudian memindahkannya ke subfolder Anda.

@waltinator: ditambahkan -type d -name 'new' -pruneuntuk mencegah traversal dari /myuser/downloads/new.


Saya membuat subdirektori bernama newdan mencoba perintah ini, saya dapatkan mv: missing file operanddanTry 'mv --help' for more information
mook765

1

Anda dapat mencoba proses alternatif ini - tetap berada di jalur

/myuser/downloads/

tetapi, alih-alih pertama kali membuat /myuser/downloads/new/direktori, alih-alih buat folder di /myuser/direktori, dengan perintah mkdir ../new, lalu pindahkan semua file downloadske new, dan akhirnya pindah newke downloads. Anda bisa melakukan ini dalam satu baris, sementara di /myuser/downloads/jalur, dengan perintah:

mkdir ../new && mv * ../new && mv ../new ../downloads

Dalam hal ini, Anda tidak perlu khawatir tentang segala jenis "penyaringan" file / folder, karena newberada pada tingkat yang sama dengan path downloads, sehingga Anda bisa memindahkan semuanya downloadske dalam new, dan kemudian pindah newke unduhan`.

Namun, jika Anda sudah memiliki subfolder yang newdibuat dan tidak ingin membuat yang lain, jangan khawatir –– cukup ubah mkdirperintah di sisi kiri yang pertama &&dalam perintah yang ditunjukkan di atas menjadi mvperintah, mendorong ke newatas di jalan; dengan kata lain, saat Anda masih di dalam /myuser/downloads/, Anda dapat mengubahnya mkdir ../newmenjadi mv new ... Kemudian subfolder new[di jalur /myuser/downloads/new/] akan didorong ke atas /myuser/new/, pada tingkat yang sama dengan /myuser/downloads/, dan kemudian Anda dapat menjalankan sisa perintah seperti yang ditunjukkan di atas. Secara keseluruhan, kita miliki, mulai dari jalur /myuser/downloads/:

mv new .. && mv * ../new && mv ../new ../downloads

dan, karena Anda ingin "memindahkan semua file dan folder / sub-folder di folder unduhan ke sub-folder [ new]", Anda selesai! Jika Anda ingin memindahkan hanya file (atau hanya folder atau [masukkan gerakan objek lebih rinci]), maka Anda harus menggunakan perintah lain yang bisa "filter" objek, seperti grep. Namun, perintah yang ditulis di atas cukup untuk tujuan Anda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.