Cách đổi tên hàng loạt tệp (hình ảnh) dựa trên tệp CSV


11

Những gì tôi có và muốn đạt được:

  1. Có hàng ngàn hình ảnh trong một thư mục.

  2. Tôi có một tệp CSV với các cột sau:

    A: tên gốc B: tên đã đổi tên

    Một hàng điển hình trông như thế này:

    "original-1.jpg","renamed-1.jpg"  
    "original-2.jpg","renamed-2.jpg"

    Tôi có thể loại bỏ các trích dẫn, đó không phải là một vấn đề.

  3. Bây giờ tôi muốn sử dụng một ứng dụng hoặc chạy một tập lệnh sẽ tìm kiếm tất cả các hình ảnh trong cột A và đổi tên chúng thành tên trong cột B (ví dụ: gốc-1.jpg -> đổi tên-1.jpg).

Có một số câu trả lời xung quanh, ví dụ:

http://ubuntuforums.org/showthread.php?t=1069652

http://systembash.com/content/one-line-batch-rename-files-USE-csv-input-file-and-awk/

Tuy nhiên, có một số tập lệnh liên quan và tôi không chắc liệu tất cả các tập lệnh đó chỉ ảnh hưởng đến thư mục nơi bạn lưu trữ tập lệnh hay chúng có thể đổi tên tất cả các tệp trên đĩa đáp ứng một số điều kiện nhất định. Tất nhiên, sau này cần phải tránh.

Những gì tôi đang tìm kiếm là một hướng dẫn đơn giản về cách đổi tên tệp và cách chọn thư mục có tệp.

Cảm ơn bạn trước.

Câu trả lời:


13

Điều này sẽ làm việc cho bạn:

sed 's/"//g' files.csv | while IFS=, read orig new; do mv "$orig" "$new"; done 

Giải trình:

  • sed 's/"//g' files.csv : xóa dấu ngoặc kép
  • IFS=, : tách đầu vào ,
  • while read orig new; do ... done: Điều này sẽ đọc từng dòng đầu vào, phân chia nó trên giá trị của $IFS(ở đây là dấu phẩy) và lưu trường thứ 1 $origvà phần còn lại là $new.
  • mv "$orig" "$new" : điều này sẽ đổi tên các tập tin theo yêu cầu.

Nếu tệp của bạn chỉ chứa tên tệp (như orig.jpg) và không có đường dẫn (không /home/take2/orig.jpghoặc tương tự), lệnh trên sẽ chỉ ảnh hưởng đến các tệp trong thư mục hiện tại của bạn. Vì vậy, bạn cần phải mở một thiết bị đầu cuối, cdđến thư mục đích và chạy nó ở đó.

Kiểm tra đầu tiên:

Để kiểm tra điều này, trước tiên bạn có thể thực hiện chạy khô bằng cách in các lệnh sẽ được chạy mà không thực sự thực hiện chúng:

sed 's/"//g' files.csv | while IFS=, read orig new; do echo mv "$orig" "$new"; done 

Tuyệt vời, điều này được giải thích tốt hơn. :) Chỉ cần kiểm tra trước khi chạy nó - Tôi phải cd vào thư mục đích và chạy dòng này hoặc tôi cần lưu dòng đó như example.sh và sau đó chạy "example.sh" từ terminal?
mất

@ Take2 bạn chỉ có thể chạy dòng trực tiếp. Tôi đã cập nhật câu trả lời với một cách để xem những gì sẽ được chạy mà không thực sự thay đổi các tập tin của bạn, tôi khuyên bạn nên làm điều đó trước tiên.
terdon

Thật tuyệt vời, nó hoạt động! Chỉ một điều nữa - nó có quan tâm nhãn của các cột là gì không (chúng là "orig" và "mới" vào lúc này) hay nó chỉ đổi tên cột A thành tên cột B?
mất 2

@ Take2 nhãn gì? Không, nó chỉ lấy trường được phân tách bằng dấu phẩy đầu tiên và đổi tên thành trường thứ hai. Lưu ý rằng nếu có nhiều hơn hai trường, nó sẽ đổi tên nó thành phần còn lại của dòng. Miễn là tệp đầu vào của bạn giống như những gì bạn đã đăng, nó sẽ hoạt động như mong đợi.
terdon

Btw. Terminal cũng hiển thị "mv: could stat 'orig': Không có tệp hoặc thư mục như vậy", mặc dù nó đã đổi tên tệp.
mất 2
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.