Jawaban:
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
-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)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 \;
-type ftidak mencegah rekursi.
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
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
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.
mv -t "$TARGET" -- "$SOURCE"/*(.)akan lebih aman (kalau-kalau "$TARGET"dimulai dengan -atau bukan direktori). Saya suka solusi zsh!
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))
import mypackagesebelumfrom mypackage import ...
from __future__impor khusus dan from pathlibimpor biasa .
import moduleharus menjadi yang pertama (yang merupakan perpustakaan dan impor pihak ketiga) from module import objectharus menjadi yang terakhir (khusus lokal / perpustakaan)
Saya akan menggunakan
mv *.*
ini akan berfungsi selama folder Anda tidak memiliki ekstensi.
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).