Jawaban:
Jika Anda ingin memindahkan semuanya kecuali direktori dari $SOURCE_DIR
ke $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 f
jika 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 mv
dengan cp
.
find . -type f -exec mv {} $TARGET \;
jika saya menjelaskan ini, find . -type f
berarti memilih semua file dan -exec mv {} $TARGET \;
berarti menjalankan mv
perintah untuk semua item yang dipilih.
Jawaban sebelumnya memiliki kesalahan .. mv
semua file di dalam sub direktori juga. Perbaikan cepat digunakan -maxdepth 1
. Maka itu bukan mv
file secara rekursif dalam sub direktori. Di bawah ini adalah yang benar ..
find . -maxdepth 1 -type f -exec mv {} $TARGET \;
-type f
tidak mencegah rekursi.
Ketika berurusan dengan file secara rekursif, find
adalah cara untuk pergi. Dalam kasus khusus ini tidak perlu, tetapi dapat digunakan dengan -maxdepth 1
jawaban 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 fl
daftar 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-dir
direktori ke destination-dir
direktori, 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 mypackage
sebelumfrom mypackage import ...
from __future__
impor khusus dan from pathlib
impor biasa .
import module
harus menjadi yang pertama (yang merupakan perpustakaan dan impor pihak ketiga) from module import object
harus 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).