Bagaimana cara memindahkan Hanya file di folder saat ini ke sub folder?

9

Saya tidak harus memindahkan folder, hanya file.

Saya sudah mencoba mv *tetapi perintah ini juga memindahkan folder.

Archit
sumber

Jawaban:

13

Jika Anda ingin memindahkan semuanya kecuali direktori dari $SOURCE_DIRke $TARGET_DIR, Anda dapat menggunakan perintah ini:

find "$SOURCE_DIR" -maxdepth 1 -not -type d -exec mv -t "$TARGET_DIR" -- '{}' +

Dijelaskan secara rinci:

  • find: Pencarian mencari file dalam direktori
  • $SOURCE_DIR: Direktori untuk mencari
  • -maxdepth 1: Jangan melihat ke dalam subdirektori
  • -not -type d: Abaikan direktori
    • Anda juga dapat menggunakan -type fjika Anda hanya ingin menyalin hal-hal yang benar-benar file, tetapi saya lebih suka yang di atas karena ia juga menangkap semua yang bukan file atau direktori (dalam tautan simbolik tertentu)
  • -exec mv -t "$TARGET_DIR" -- '{}' +: Jalankan perintah di mv -t "$TARGET_DIR" -- FILES...mana FILES...semua file yang cocok (terima kasih @DavidFoerster)
Frxstrem
sumber
2
find ... -exec mv -t "$TARGET_DIR" -- '{}' +akan lebih aman (kalau $TARGET_DIR- kalau tidak ada direktori atau pertandingan dimulai -) dan lebih efisien (karena tidak menghasilkan sub-proses baru untuk setiap file yang cocok).
David Foerster
@DavidFoerster Terima kasih, diperbarui (juga belajar sesuatu yang baru hari ini!)
Frxstrem
5

Saya pikir Anda ingin hanya mv file Anda. Pertama pergi ke direktori Anda dan gunakan perintah ini, ganti $ TARGET dengan jalur direktori target Anda. Jika Anda ingin menyalin file Anda ganti mvdengan cp.

find . -type f -exec mv {} $TARGET \;

jika saya menjelaskan ini, find . -type fberarti memilih semua file dan -exec mv {} $TARGET \;berarti menjalankan mvperintah untuk semua item yang dipilih.


Jawaban sebelumnya memiliki kesalahan .. mvsemua file di dalam sub direktori juga. Perbaikan cepat digunakan -maxdepth 1. Maka itu bukan mvfile secara rekursif dalam sub direktori. Di bawah ini adalah yang benar ..

find . -maxdepth 1 -type f -exec mv {} $TARGET \;
Emalsha Rasad
sumber
Saya tidak berpikir si penanya menginginkan ini! Itu juga akan memindahkan semua file dalam subdirektori apa pun ke direktori target yang sama. Itu -type ftidak mencegah rekursi.
Martin Thornton
@MartinThornton terima kasih atas saran Anda .. saya akan mengedit jawaban saya ...
Emalsha Rasad
3

Pendekatan python

Ketika berurusan dengan file secara rekursif, findadalah cara untuk pergi. Dalam kasus khusus ini tidak perlu, tetapi dapat digunakan dengan -maxdepth 1jawaban lain yang ditunjukkan.

Perintah python sederhana dapat melakukannya juga. Ini sebuah contoh:

$ tree
.
├── a_directory
└── a_file

$ python -c "import os,shutil;fl=[f for f in os.listdir('.') if os.path.isfile(f)];                                      
> map(lambda x:shutil.move(x,'./a_directory'),fl)"

$ tree
.
└── a_directory
    └── a_file

1 directory, 1 file

Bagaimana ini bekerja:

  • fl=[f for f in os.listdir('.') if os.path.isfile(f)]mengulangi semua item yang os.listdir('.')ditemukan dan kami menguji apakah item tersebut adalah file yang menggunakan os.path.isfile()fungsi.

  • Setelah fldaftar file dibangun, kami menggunakan map()fungsi. Fungsi ini membutuhkan dua argumen - fungsi, dan daftar item; itu akan melakukan fungsi yang kami berikan per setiap file dalam daftar. Jadi di sini kita memiliki lambda x:shutil.move(x,'./a_directory')fungsi anonim yang akan memindahkan file yang diberikan ke direktori yang diberikan, dan kemudian kita memiliki fl- daftar file yang kita buat.

Untuk keterbacaan dan penggunaan umum, kita juga bisa menulis ulang ini sebagai skrip python umum, yang mengambil dua argumen - direktori sumber dan subdirektori tujuan.

#!/usr/bin/env python3
from os import listdir
from os.path import isfile,realpath
from os.path import join as joinpath
from shutil import move
from sys import argv

# this is script's full path
script=realpath(__file__)
# get all items in a given directory as list of full paths
fl=[ joinpath(argv[1],f) for f in listdir(argv[1]) ] 
# filter out script itself ( just in case) and directories
fl_filtered = [ f for f in fl if isfile(f) and not script == realpath(f) ]
# Uncomment this in case you want to see the list of files to be moved
# print(fl_filtered)
# move the list of files to the given destination
for i in fl_filtered:
     move(i,argv[2])

Dan penggunaannya seperti ini:

$ tree
.
├── a_directory
├── a_file
└── files2subdir.py

1 directory, 2 files

# Notice: the script produces no output unless you uncomment print statement
$ ./files2subdir.py "." "./a_directory"                                                                                  

$ tree
.
├── a_directory
│   └── a_file
└── files2subdir.py
Sergiy Kolodyazhnyy
sumber
Berikut pendekatan Python
jfs
3

Jika Anda menggunakan zsh sebagai ganti bash, Anda dapat melakukan ini:

mv "$SOURCE"/*(.) "$TARGET"

Pada (.)akhirnya disebut kualifikasi glob; bagian .dalam secara khusus berarti hanya mencocokkan file biasa.

Melakukannya mv *(.) "$target"cepat dan praktis. Namun, jika Anda melakukan ini sebagai bagian dari skrip, Anda mungkin ingin mempertimbangkan untuk menulis sesuatu seperti yang disarankan Frxstrem dan David Forester mv -t "$target" -- *(.),, untuk menangani kasus sudut yang lebih baik yang mungkin muncul dalam penggunaan orang lain.

JoL
sumber
1
Seperti yang ditunjukkan David Forester pada jawaban saya, mv -t "$TARGET" -- "$SOURCE"/*(.)akan lebih aman (kalau-kalau "$TARGET"dimulai dengan -atau bukan direktori). Saya suka solusi zsh!
Frxstrem
2

Untuk memindahkan semuanya kecuali direktori dari source-dirdirektori ke destination-dirdirektori, dengan Python:

#!/usr/bin/env python3
"""Usage: mv-files <source-dir> <destination-dir>"""
import shutil
import sys
from pathlib import Path

if len(sys.argv) != 3:
    sys.exit(__doc__)  # print usage & exit 1
src_dir, dest_dir = map(Path, sys.argv[1:])
for path in src_dir.iterdir():
    if not path.is_dir():
        shutil.move(str(path), str(dest_dir / path.name))

Lihat Menjalankan File Python di Terminal .

jfs
sumber
@SergiyKolodyazhnyy Saya tidak melihat persyaratan seperti itu di pep-8 dan (sesuai dengan contoh di sana) itu sebenarnya kebalikannya: import mypackagesebelumfrom mypackage import ...
jfs
@SergiyKolodyazhnyy jangan bingung dengan from __future__impor khusus dan from pathlibimpor biasa .
jfs
Ya, sepertinya saya salah membaca bagian itu. Tidak, Anda benar, import moduleharus menjadi yang pertama (yang merupakan perpustakaan dan impor pihak ketiga) from module import objectharus menjadi yang terakhir (khusus lokal / perpustakaan)
Sergiy Kolodyazhnyy
0

Saya akan menggunakan

mv *.*

ini akan berfungsi selama folder Anda tidak memiliki ekstensi.


sumber