Câu hỏi Di chuyển tất cả các tệp thuộc loại hoặc tiện ích mở rộng nhất định


Tôi có một bên ngoài lớn với nhiều thư mục con mà tôi muốn di chuyển tất cả video, hình ảnh và âm nhạc sang một ổ cứng khác, cách tốt nhất để làm điều này là gì?


2
2017-08-08 19:58


gốc


stackoverflow.com/questions/18338322/… - dan08
Điều đó trông tương tự như những gì tôi đang cố gắng làm, chỉ có tôi muốn có nó di chuyển tất cả các tập tin tìm thấy vào một thư mục khác. Xin lỗi, tôi rất mới với dòng lệnh và tôi không chắc chắn làm thế nào để thay đổi điều đó để làm điều đó bản thân mình. - Daniel


Các câu trả lời:


Tôi sẽ thử một cái gì đó như ..

for files in $(find / | grep -P "([.]mp3$)|([.]avi$)")
do
cp $files /media/<your_external_drive>/target_folder/
done

Bạn phải thêm mọi tiện ích bạn muốn tìm kiếm trong regex nếu bạn muốn thực hiện tất cả trong một lần chụp.

Hoặc nếu bạn chỉ muốn di chuyển các thư mục, bạn có thể sử dụng,

cp -r /target/dir/on/machine /target/dir/on/external/drive

cho mỗi thư mục chứa các tệp phương tiện của bạn.


1
2017-08-08 20:04



Điều này có vẻ hoàn hảo, bây giờ làm thế nào để tôi xác định trong tìm để cho nó biết nơi để tìm? - Daniel
bạn muốn nói find /path/to/your/target/directory, nơi đường dẫn đến thư mục đích của bạn giống như / home / username / Music, hoặc / home / username / Video. ví dụ ở trên, nơi tôi đã sử dụng find /, xác định rằng tìm kiếm nên lặp qua toàn bộ hệ thống tệp có sẵn, mà khá nhiều luôn luôn không cần thiết, nhưng đầu ra là khá. - blanket_cat
Những dấu ngoặc và dấu ngoặc kép đó có đúng không? - Tim
Họ bây giờ, bắt tốt. - blanket_cat


Tôi không thực sự chắc chắn rồi bạn muốn di chuyển nhiều tệp từ nhiều thư mục nhưng đây là lệnh cơ bản để tìm tệp của nhiều tiện ích mở rộng trong một cấu trúc thư mục:

find /path/to/look/ -type f \( -iname \*.mp3 -o -iname \*.avi -o -iname \*.mp4 \)

Bạn rõ ràng sẽ muốn tack nhiều hơn -o -iname ... vào đó cho đến khi bạn chắc chắn rằng bạn đang tìm tất cả các tập tin mà bạn muốn. Khi bạn đã có mọi thứ, chỉ cần thêm phần này vào cuối:

-exec mv -t /path/to/destination {} +

Và điều đó sẽ chuyển tất cả chúng vào thư mục được chỉ định.


Cách Bashier làm điều này sẽ sử dụng một vài biến tố tổng hợp (globstar để tìm kiếm đệ quy với **, nullglob chỉ trả lại các tệp hợp lệ và nocaseglob bỏ qua trường hợp) và sau đó chỉ cần bỏ qua chúng mv một cách đơn giản for vòng lặp:

shopt -s globstar nullglob nocaseglob
for f in /path/to/look/{**/,}*.{mp3,avi,mp4}; do
  mv "$f" /path/to/destination/
done

1
2017-08-10 00:00





Tôi rất khuyên bạn nên chương trình FreeFileSync. Nó là tuyệt vời cho không chỉ đồng bộ hai thư mục, mà còn cho nhiệm vụ bạn có trong tâm trí. Bạn có thể thêm bộ lọc để bao gồm hoặc loại trừ các mẫu. Trước tiên, bạn chỉ cần duyệt đến nguồn gốc ở bên trái và điểm đến ở bên phải. Sau đó nhấp vào so sánh để tìm kiếm trong tất cả các tệp của bạn. Cuối cùng, nhấp vào kênh màu đỏ ở trên cùng để chỉnh sửa các bộ lọc.

Đối với các bộ lọc, bạn đặt mỗi mẫu trên một dòng mới. Bạn có thể thay thế * trong phần bao gồm với phần như sau và để phần không bao gồm bị loại bỏ. Sau đây sẽ chỉ chuyển các tệp mp3, avi và jpg:

*.mp3
*.avi
*.jpg

Hoặc, nếu bạn rời khỏi * trong phần bao gồm, bạn có thể nói những tệp bạn không muốn di chuyển. Phần sau được thêm vào phần loại trừ sẽ di chuyển mọi thứ ngoại trừ các tệp txt, odt và pdf:

*.txt
*.odt
*.pdf

Khi bạn thực hiện các thay đổi và đóng hộp thoại bộ lọc, các tệp sẽ không được di chuyển sẽ chuyển sang màu xám. Các nút ở dưới cùng bên cạnh "Chọn Chế độ xem:" cho phép bạn thay đổi tệp nào được hiển thị (các nút này không ảnh hưởng đến tệp sẽ được di chuyển). Chỉ hiển thị các tệp "Không làm gì" bằng cách chỉ chọn thanh màu xám được chọn, tìm bất kỳ thứ gì bạn muốn được di chuyển mà sẽ không có và sửa đổi các bộ lọc cho phù hợp. Tương tự như vậy, chỉ hiển thị các tệp được di chuyển bằng cách chỉ chọn mũi tên màu xanh lá cây, hãy tìm bất kỳ mục nào được di chuyển nhưng bạn không muốn và sửa đổi các bộ lọc cho phù hợp.


0
2017-08-08 20:13





Bạn có thể sử dụng một tập lệnh python đơn giản để thực hiện công việc:

#!/usr/bin/env python3

import os
import shutil

source_dir = "/path/to/files"; target_folder = "/path/to/destination"; extensions = (".mp3", ".avi")

for root, dirs, files in os.walk(source_dir):
    for name in files:
        if name.endswith(extensions):
            file = root+"/"+name
            shutil.move(file, target_folder+"/"+name)

Dán mã ở trên vào một tệp văn bản trống, nhập các thư mục đích và nguồn, nhập phần mở rộng tệp bạn muốn di chuyển, lưu nó dưới dạng move.py và chạy nó bằng lệnh:

python3 /path/to/move.py

Để tránh ghi đè các bản sao có thể có (và đổi tên chúng)

Nếu có rủi ro là thư mục chứa các tên trùng lặp (tên) mà bạn muốn giữ lại, thì mã này sẽ mở rộng hơn một chút:

#!/usr/bin/env python3

import os
import shutil

source_dir = "/path/to/files"; target_folder = "/path/to/destination"; extensions = (".mp3", ".avi")

dup = 1
for root, dirs, files in os.walk(source_dir):
    for name in files:
        if name.endswith(extensions):
            file = root+"/"+name
            while os.path.exists(target_folder+"/"+name):
                name = name[:name.rfind(".")]+"_"+str(dup)+name[name.rfind("."):]
                dup = dup+1
            shutil.move(file, target_folder+"/"+name)

Trong trường hợp này, nhiều lần file.mp3 sẽ được đổi tên thành:

file.mp3
file_1.mp3
file_2.mp3
...etc.

0
2017-08-10 06:56