Làm thế nào để di chuyển tập tin vào các thư mục tương ứng có cùng tên?


2

Kịch bản ví dụ:

Tôi có nhiều tệp kết thúc bằng .torrent và tôi muốn chuyển chúng vào các thư mục có cùng tên.

Ví dụ cho các tệp sau:

abc.torrent
def.torrent
some files has spaces.torrent
or [special] (characters).torrent
or . (dots).torrent
xyz.torrent

Tôi muốn chuyển chúng vào các thư mục tương ứng của nó (nếu tồn tại) có cùng tên, ví dụ:

  • abc.torrent đi vào abc/
  • def.torrent đi vào def/
  • và v.v.

Nếu thư mục không tồn tại, tệp sẽ không bị ảnh hưởng (vì nó có thể liên quan đến tải xuống không đầy đủ).

Tôi tin rằng BitTorrent không có các tùy chọn như vậy. Nếu vậy, tôi muốn tìm một số dòng lệnh để đạt được điều đó.

Tùy chọn tôi muốn chỉ định thư mục nguồn của các tệp của mình và thư mục đích với các thư mục dự kiến.

Có ý kiến ​​gì không?


@terdon Nếu thư mục không tồn tại, hãy bỏ qua tệp và tiếp tục, vì các tệp có thể liên quan đến tải xuống không đầy đủ.
kenorb

Oh tốt, tôi đã đưa ra cả hai lựa chọn.
terdon

Câu trả lời:


3
  • Không đệ quy:

    for t in *torrent; do [ -d "${t%.*}" ] && mv "$t" "${t%.*}"; done 
    

    Các ${var%pattern} cú pháp loại bỏ trận đấu ngắn nhất của pattern từ cuối một biến. Trong trường hợp này, nó chỉ cần loại bỏ phần mở rộng.

  • Đệ quy (sử dụng bash ):

    shopt -s globstar
    for t in **/*torrent; do [ -d "${t%.*}" ] && mv "$t" "${t%.*}"; done
    

    Các globstar tùy chọn làm ** phù hợp với bất kỳ tập tin và 0 hoặc nhiều thư mục. Lưu ý rằng ở trên mong muốn thư mục đích là thư mục con của thư mục mẹ của tệp torrent. Vì vậy, nếu một tập tin đang ở foo/bar/baz.torrent, nó sẽ được chuyển đến foo/bar/baz/baz.torrent.

  • Không đệ quy, tạo thư mục nếu vắng mặt:

    for t in *torrent; do mkdir -p "${t%.*}"; mv "$t" "${t%.*}"; done 
    

    Các -p tùy chọn cho biết mkdir để in không có lỗi nếu thư mục đã tồn tại và tạo thư mục mẹ khi cần. Vì thế, mkdir -p foo/bar/baz cũng sẽ tạo ra foobar thư mục nếu chúng không tồn tại.

  • Đệ quy, tạo thư mục nếu vắng mặt:

    shopt -s globstar
    for t in **/*torrent; do mkdir -p "${t%.*}"; mv "$t" "${t%.*}"; done
    

Đối với phần 'tạo thư mục nếu vắng mặt', tôi nghĩ bạn có thể sử dụng $_ bên trong mv lệnh như mkdir dường như cập nhật nó bất kể thư mục có tồn tại hay không.
h.j.k.

**/*torrent phiên bản tạo đường dẫn, vì vậy -d kiểm tra lại chúng (không phải tự đặt tên), đây là phiên bản sử dụng tên cơ sở và chuyển vào /foo thư mục: for t in **/*torrent; do [ -d /foo/"$(basename "${t%.*}")" ] && mv -v "$t" /foo/"$(basename "${t%.*}")/"; done
kenorb

3

Vì tôi không thể tìm thấy tùy chọn như vậy trên phiên bản OST của BitTorrent, tôi đã viết một đoạn sau:

find . -name "*.torrent" -exec sh -c 'DST=$(find . -type d -name "$(basename "{}" .torrent)" -print -quit); [ -d "$DST" ] && mv -v "{}" "$DST/"' ';'

Điều này sẽ tìm kiếm .torrent các tập tin trong thư mục hiện tại ( . ) và tìm các thư mục ( DST ) có cùng tên đệ quy được tìm thấy trong cùng một thư mục ( . ). Để kiểm tra các thư mục khác nhau, thay đổi dấu chấm ( . ) đến các điểm đến thích hợp. Xem kịch bản hoàn chỉnh: mv_torrents.sh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.