Bagaimana cara memindahkan file dari subdirektori bersarang ke folder lain di ubuntu? (Mencoba melepas banyak subfolder)

36

Bagaimana cara memindahkan file dan bukan direktori ke folder lain / folder induk?

Saya memiliki struktur folder yang sangat jelek, dengan beberapa file .mp3 terkubur sedalam 6 level dalam sebuah sub-folder.

Saya ingin berakhir dengan semua file (kebanyakan .mp3 tetapi tidak semua) dalam satu direktori, tanpa subdirektori sama sekali, menggunakan Ubuntu.

Membantu?

Chris
sumber

Jawaban:

48

Ada jawaban yang bagus di askubuntu-QA .

Untuk melakukannya, Buka terminal dan jalankan perintah ini:

mv  -v ~/Downloads/* ~/Videos/

Ini akan memindahkan semua file dan folder dari folder Downloads ke folder Videos.


Untuk Memindahkan semua file, tetapi bukan folder:

Tapi, Jika Anda tertarik untuk memindahkan semua file (tetapi bukan folder) dari folder Downloads ke folder Videos, gunakan perintah ini

find ~/Downloads/ -type f -print0 | xargs -0 mv -t ~/Videos

Untuk hanya memindahkan file dari folder Unduh, tetapi tidak dari sub-folder:

Jika Anda ingin memindahkan semua file dari folder Unduhan, tetapi tidak ada file di dalam folder di folder Unduhan, gunakan perintah ini:

find ~/Downloads/ -maxdepth 1 -type f -print0 | xargs -0 mv -t ~/Videos

di sini, -maxdepthopsi menentukan seberapa dalam find harus mencoba, 1artinya, hanya direktori yang ditentukan dalam perintah find. Anda dapat mencoba menggunakan 2, 3juga untuk menguji.

Lihat manual menemukan Ubuntu untuk penjelasan terperinci.

Sumber

Christian Wörz
sumber
Jika yang ingin saya lakukan adalah menyalin semua file ke folder, apakah saya hanya perlu mengubah mv ke cp? Saya baru
mengenal
13

Larutan

find /src/dir -type f -exec mv --backup=numbered -t /dst/dir {} +

Perintah akan menemukan semua file biasa di bawah /src/dir(termasuk semua subdirektori) dan memindahkannya ke /dst/dirdengan menggunakan perintah mv. Cukup ganti direktori dengan milik Anda. File dengan nama yang sama akan diganti namanya secara otomatis.

Memilih file untuk dipindahkan

Jika Anda ingin memindahkan file MP3 saja, tambahkan -iname "*.mp3"opsi ke findperintah setelah -type f.

Perbandingan dengan balasan oleh c0dev

Hanya perintah kedua dalam jawaban c0dev yang menjawab pertanyaan. Di bawah ini adalah perbandingannya dengan jawaban ini. Poin 3. dan 4. dapat diselesaikan dengan cara yang sama seperti di sini.

  1. Kecuali mvsolusi dengan -exec +tidak perlu memanggil perintah tambahan seperti xargsatau paralleldan menyerahkan nama file dua kali.
  2. Balasan lain akan secara diam-diam menimpa file yang memiliki nama yang sama. Di sini file akan secara otomatis diganti namanya berkat opsi --backup=numbered. Sayangnya cadangan dengan suffix like ~3~ini akan disembunyikan di sebagian besar file yang dikelola secara default. Sayangnya mvtidak memungkinkan perubahan akhiran tetapi bisa dengan mudah diproses pasca-perintah tambahan. Ini adalah ekstensi GNU.
  3. Sebaliknya -print0 -exec command {} +adalah bagian dari standar IEEE Std 1003.1 (POSIX), ISO / IEC 9945 dan Spesifikasi Tunggal UNIX. Karena itu harus lebih portabel. Lihat IEEE Std 1003.1, Edisi 2004 , IEEE Std 1003.1, Edisi 2013 dan 0000243: Tambahkan -print0 ke "find" . Tapi bagaimanapun, -tsaklar yang diperlukan mvadalah ekstensi GNU sehingga seluruh perintah tidak portabel antara sistem POSIX.

Catatan: Dalam kasus ini findakan mampu menghasilkan jalur dimulai dengan -(saya tidak tahu dari setiap pelaksanaan seperti findpada saat ini.) Yang {}harus didahului dengan indikator akhir-of-pilihan: --.

pabouk
sumber
Kesalahan: cari: argumen yang hilang ke `-exec '
Chris
@ Chris: Anda benar, tampaknya itu {}harus menjadi argumen terakhir. Dikoreksi.
pabouk
@ Chris: Apakah ini berfungsi sekarang seperti yang Anda inginkan? Jika ya, Anda mungkin dapat menerima jawabannya sehingga pertanyaan Anda tidak muncul sebagai "tidak terselesaikan".
pabouk
Inilah yang saya jalankan, dan mendapatkan kesalahan direktori-tidak-ditemukan:
Chris
apa yang saya jalankan: clstal @ clap: ~ $ ls 1st script.R Firefox_wallpaper.png part1vidproj zotero pdf manager Desktop mozilla.pdf Gambar Dokumen induk Video clstal @ clap: ~ $ find / source / direktori -type f -exec mv -t / destination / directory {} + find: `/ source / direktori ': Tidak ada file atau direktori seperti itu
Chris
2

Sayangnya, saya tidak memiliki reputasi yang cukup tinggi untuk mengomentari solusi yang ditandai. Namun, saya ingin memperingatkan orang lain tentang masalah yang saya hadapi. Itu sangat amatir; Namun, ketika Anda melakukan beberapa hal, mungkin tidak terlintas di pikiran Anda pada awalnya. Semoga ini bisa membantu orang lain.

Masalah

Variasi dari pesan berikut diberikan setelah memulai perintah. Perintah itu kemudian membuat banyak file.

mv: `/data/share/docs/src/dir/filename.ext' and `/data/share/docs/src/dst/filename.ext' are the same file

Sebab

Ini /srcadalah induk dari /dst(misalnya /src/../dst/).

Larutan

Walaupun mungkin ada solusi yang lebih baik, saya cukup memindahkan file ke direktori sementara di luar saya /srcdan kemudian menjalankan kembali perintah untuk menempatkannya kembali di dalam /src/../dstdirektori yang saya inginkan berakhir.

MackAltman
sumber
2

One-liner saya - ini berfungsi pada Mac tetapi juga harus dilakukan pada * nix apa pun. Mulai dari direktori induk.

# Move files to parent and delete empty folders
find . -not -type d -print0 | xargs -0J % mv -f % . ; find . -type d -depth -print0 | xargs -0 rm -rf

Bagian pertama memindahkan semuanya dari semua subfolder ke folder aktual dari tempat Anda mengosongkan perintah; bagian kedua memeriksa apakah subdir kosong (sekarang seharusnya :-) dan menghapusnya sehingga Anda mendapatkan semuanya di sini tanpa subdir.

File-X
sumber
(1) Tolong jelaskan apa yang dilakukan jawaban Anda, dan kelebihan apa pun yang ada di balik jawaban lain (yang sangat mirip). Tolong jangan menanggapi dalam komentar; edit  jawaban Anda untuk membuatnya lebih jelas dan lebih lengkap. (2) Perhatikan bahwa -notoperatornya tidak standar, sehingga perintah Anda lebih mudah dibawa daripada yang lain.
Scott
temukan. -tidak -type d -print0 | xargs -0J% mv -f%. ; temukan. -type d -depth -print0 | xargs -0 rm -rf Saya menjalankan perintah ini di folder dan menghapus sub folder, folder tempat saya berada, dan kemudian pindah ke folder induk. Untungnya saya sedang menonton file manager saya dan berhasil menghentikan perintah dan itu dijalankan di folder tes.
Will
1

Buka terminal, cd ke folder folder Anda dengan file dan jalankan find . -mindepth 2 -type f -print -exec mv {} . \; untuk memindahkan semua file dari sub-direktori ini ke yang sekarang.

singa
sumber