Tôi không phải di chuyển các thư mục, chỉ các tập tin.
Tôi đã thử mv *
nhưng lệnh này cũng di chuyển các thư mục.
Tôi không phải di chuyển các thư mục, chỉ các tập tin.
Tôi đã thử mv *
nhưng lệnh này cũng di chuyển các thư mục.
Câu trả lời:
Nếu bạn muốn di chuyển mọi thứ trừ các thư mục từ $SOURCE_DIR
đến $TARGET_DIR
, bạn có thể sử dụng lệnh này:
find "$SOURCE_DIR" -maxdepth 1 -not -type d -exec mv -t "$TARGET_DIR" -- '{}' +
Giải thích chi tiết:
find
: Tìm kiếm các tập tin trong một thư mục$SOURCE_DIR
: Thư mục để tìm kiếm trong-maxdepth 1
: Đừng nhìn vào các thư mục con-not -type d
: Bỏ qua thư mục
-type f
nếu bạn chỉ muốn sao chép những thứ thuộc tệp nghiêm ngặt, nhưng tôi thích ở trên vì nó cũng nắm bắt mọi thứ không phải là tệp hay thư mục (đặc biệt là các liên kết tượng trưng)-exec mv -t "$TARGET_DIR" -- '{}' +
: Chạy lệnh mv -t "$TARGET_DIR" -- FILES...
trong đó FILES...
có tất cả các tệp phù hợp (cảm ơn @DavidFoerster)Tôi nghĩ rằng bạn chỉ muốn mv các tệp của mình. Trước tiên, hãy vào thư mục của bạn và sử dụng lệnh này, thay thế $ TARGET bằng đường dẫn thư mục đích của bạn. Nếu bạn muốn sao chép các tập tin của bạn thay thế mv
bằng cp
.
find . -type f -exec mv {} $TARGET \;
nếu tôi giải thích điều này, find . -type f
có nghĩa là chọn tất cả các tệp và -exec mv {} $TARGET \;
có nghĩa là thực thi mv
lệnh cho tất cả các mục đã chọn.
Câu trả lời trước có lỗi .. mv
tất cả các tệp trong thư mục con cũng có. Cách khắc phục nhanh là sử dụng -maxdepth 1
. Sau đó, nó không đệ quy mv
các tập tin trong các thư mục phụ. Dưới đây là một trong những chính xác ..
find . -maxdepth 1 -type f -exec mv {} $TARGET \;
-type f
không ngăn cản đệ quy.
Khi xử lý các tệp đệ quy, find
là cách để đi. Trong trường hợp cụ thể này, nó không cần thiết, nhưng có thể được sử dụng -maxdepth 1
như các câu trả lời khác cho thấy.
Lệnh python đơn giản cũng có thể làm điều đó. Đây là một ví dụ:
$ 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)]
lặp đi lặp lại trên tất cả các mục os.listdir('.')
tìm thấy và chúng tôi kiểm tra xem mục đó có phải là tệp sử dụng os.path.isfile()
hàm hay không.
Khi fl
danh sách tập tin được xây dựng, chúng tôi sử dụng map()
chức năng. Hàm này có hai đối số - một hàm và một danh sách các mục; nó sẽ thực hiện chức năng mà chúng tôi đã cung cấp cho mỗi tệp trong một danh sách. Vì vậy, ở đây chúng ta có lambda x:shutil.move(x,'./a_directory')
chức năng ẩn danh sẽ di chuyển một tệp đã cho vào một thư mục nhất định và sau đó chúng ta có fl
- danh sách các tệp mà chúng ta đã tạo.
Để dễ đọc và sử dụng chung, chúng ta cũng có thể viết lại đây là tập lệnh python chung, trong đó có hai đối số - thư mục nguồn và thư mục con đích.
#!/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])
Và cách sử dụng là như vậy:
$ 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
Nếu bạn đang sử dụng zsh thay vì bash, bạn có thể làm điều này:
mv "$SOURCE"/*(.) "$TARGET"
Các (.)
cuối cùng được gọi là một vòng loại glob; các .
bên đặc biệt có nghĩa là chỉ phù hợp với các file thông thường.
Làm một mv *(.) "$target"
là nhanh chóng và thiết thực. Tuy nhiên, nếu bạn đang thực hiện điều này như một phần của kịch bản, bạn có thể muốn xem xét thay vì viết một cái gì đó giống như những gì Frxstrem và David Forester đề xuất mv -t "$target" -- *(.)
, để xử lý tốt hơn các trường hợp góc có thể phát sinh trong việc sử dụng của người khác.
mv -t "$TARGET" -- "$SOURCE"/*(.)
sẽ an toàn hơn (trong trường hợp "$TARGET"
bắt đầu bằng một -
hoặc không phải là một thư mục). Tôi thích giải pháp zsh!
Để di chuyển mọi thứ trừ thư mục từ source-dir
thư mục này sang destination-dir
thư mục khác, trong 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
trướcfrom mypackage import ...
from __future__
hàng nhập khẩu đặc biệt và from pathlib
hàng nhập khẩu thông thường .
import module
nên là người đầu tiên (là thư viện và nhập khẩu của bên thứ ba) from module import object
nên là lần cuối (cụ thể tại địa phương / thư viện)
Tôi sẽ sử dụng
mv *.*
điều này sẽ hoạt động miễn là các thư mục của bạn không có tiện ích mở rộng.
find ... -exec mv -t "$TARGET_DIR" -- '{}' +
sẽ an toàn hơn (trong trường hợp$TARGET_DIR
không có thư mục hoặc trận đấu bắt đầu-
) và hiệu quả hơn (vì nó không sinh ra một quy trình phụ mới cho mỗi tệp phù hợp).