Cara memindahkan hanya file di Unix


18

Bagaimana saya bisa memindahkan hanya file biasa (bukan direktori) dari satu folder di Linux ke folder lain menggunakan mvperintah?

Saya sudah mencoba mv * ~/, tetapi ia menyalin semuanya termasuk direktori.


komentar Anda menyebutkan batasan tambahan: perintah tidak boleh memindahkan file tersembunyi dari direktori kerja saat ini. jika ini benar, bisakah Anda mengedit pertanyaan Anda untuk menyebutkan ini? mengatakan "pindahkan file saja" membuat kita berpikir "pindahkan semua file", yang termasuk file tersembunyi.
quack quixote

Jawaban:


29

Anda dapat mencoba

find . -maxdepth 1 -type f -exec mv {} destination_path \;

2
Wow, seseorang yang tahu cara menggunakan find. Untuk kelengkapan Anda harus menggunakan -nama [^.] * Dalam find, yaitu --- find. -maxdepth 1 -type f -name [^.] * -exec mv {} path \;
chris

JANGAN SALIN-PASTE INI KE SHELL ANDA. Tanda titik koma akan menyebabkannya dieksekusi segera. :)
Sherwood Callaway

@ SherwoodCallaway Tanda titik koma adalah untuk menandai akhir dari-exec
dstonek

4

Saya seorang "menggunakan palu untuk semuanya" agak jadi saya menggunakan program shell bourne untuk hal-hal lain menggunakan program eksternal untuk ...

for file in * .* 
do
  test -f "$file" && mv "$file" "$HOME"/
done

Beberapa orang suka menyelesaikan sesuatu dengan mengetik sesedikit mungkin tapi saya pengetik yang cukup cepat dan saya punya hal-hal seperti ini tertanam dalam otak saya sehingga tidak terlalu merepotkan untuk melakukan ini daripada mencari yang tepat argumen untuk menemukan dan mengeksekusi dan semua itu.

YMMV, meskipun ...


terima kasih untuk itu saya akan mencobanya. tetapi saya masih membutuhkan jawaban lain karena untuk proyek saya lakukan di linux saja. terima kasih banyak

1
Ini adalah jawaban untuk pertanyaan Anda. mv tidak memiliki pemahaman tentang file atau direktori atau fifos atau file khusus lainnya. mv hanya memahami entri direktori dan inode, dan sejauh yang berkaitan, semuanya tetap sama terlepas dari jenis file. Untuk memungkinkan mv hanya memindahkan jenis file tertentu, Anda perlu sesuatu seperti tes atau temukan yang benar-benar dapat melihat inode untuk melihat apa file tersebut. Dengan kata lain, Anda ditanya pertanyaan jebakan jika Anda diminta melakukannya hanya dengan mv.
chris

1
Dan saya katakan bahwa mv mengerti inode hanya karena ia dapat memindahkan file dari satu filesystem ke yang lain, yang secara teknis cp lalu rm, bukan mv (yang sebenarnya hanya ln lalu rm). Lihat entri tautan dan direktori.
chris

2
shorty: Ini adalah jawaban yang bagus, Anda harus menggunakan sesuatu selain perintah mv (setidaknya shell). Ini tentang dasar karena tanpa pemrograman.
Kyle Brandt

3

@Mereghost sangat dekat. Inilah yang saya bisa untuk memindahkan semua file (termasuk file tersembunyi), tetapi tidak direktori:

find . -maxdepth 1 -type f -name '*' -exec mv -n {} /destination_path \;

The .setelah menemukan mengasumsikan Anda direktori saat ini adalah sumber dari file yang ingin Anda bergerak. Jika tidak, perintah dapat direvisi, sebagai berikut:

find /source_path -maxdepth 1 -type f -name '*' -exec mv -n {} /dest_path \;

Jika Anda ingin memindahkan hanya file biasa dan bukan file tersembunyi:

find . -maxdepth 1 -type f -name '[!.]*' -exec mv -n {} /dest_path \;

Jika Anda ingin memindahkan hanya file tersembunyi dan bukan file biasa:

find . -maxdepth 1 -type f -name '.*' -exec mv -n {} /dest_path \;

0

Jika Anda tidak memiliki folder dengan nama titik di dalamnya, Anda dapat memindahkan semuanya dengan mudah:

mv . ~ / folder tujuan

(Asumsi saya adalah semua file Anda adalah sesuatu. Sesuatu (dalam kasus saya semua biasanya))

TAPI terima kasih atas jawaban lain - sangat membantu. Terima kasih


-1

Anda dapat menggunakan find

find * -maxdepth 1 -type f -exec mv {} ~ \;

ya, itu bekerja tetapi tidak 100% menyalin semua file dari direktori dan sub direktori ke ~ / lokasi. saya butuh sesuatu yang sangat mendasar yang menyalin file tanpa file tersembunyi dari direktori saya ke direktori lain. itu dia. terima kasih atas sarannya

Itu tidak mungkin dengan maxdepth sebagai 1.
John T

diperbaiki sehingga tidak akan menyalin file tersembunyi.
John T

1
Sintaks pada find adalah find maka direktori kemudian deskripsi operasi dan hal-hal yang cocok. Satu akan biasanya tidak pernah menggunakan seperti wildcard seperti menemukan * tanpa melindunginya dari globbing (yaitu menemukan / path / ke / direktori -name goo * -type f.
chris

1
Temukan hanya berfungsi dengan baik jika Anda memberikan satu jalur untuk memeriksa. Dalam contoh Anda, misalnya, jika ada file yang diawali dengan a - find akan meledak secara tak terduga. Anda selalu jauh lebih baik hanya memiliki satu program untuk membaca entri direktori, dan dalam contoh Anda, Anda agak menggunakan dua program yang berbeda (temukan dan shell).
chris

-2

mv `find ./sourcedir/* -type f` ./destdir


2
Ini akan gagal untuk semua file yang berisi spasi putih di namanya. Output dari perintah yang mencetak nama file tidak boleh diuraikan kecuali jika dapat dijamin itu benar-benar dibatasi. Lihat Mengapa Anda tidak perlu menguraikan output ls (1) untuk ide utamanya. Menggunakan find's -execpilihan adalah cara terbaik untuk menghindari masalah tersebut.
slhck
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.