• Thứ Năm, 23/03/2006 10:50 (GMT+7)

    Đặt lại tên tập tin theo ngày giờ

    Hình ảnh bạn lấy từ internet hay chép từ máy ảnh kỹ thuật số sang thường có tên dạng như IMG001.jpg, IMG002.jpg... Những tên gọi này thật đơn điệu và có thể làm lẫn lộn cơ sở dữ liệu hình ảnh của bạn. Chẳng hạn, sau một chuyến du lịch về, khi truyền những hình ảnh từ máy chụp hình kỹ thuật số vào máy tính, nếu bạn không chịu khó chỉnh sửa tên các tập tin thì những hình mới trùng tên có thể vô tình chép đè lên những hình cũ làm bạn mất đi những tấm hình quý giá.

    Trong DOS, Windows9x hay Windows 2000/XP, thủ thuật nhỏ sử dụng ngôn ngữ BATCH sau đây có thể giúp bạn đặt lại tên những tập tin hình ảnh của mình theo ngày giờ mà tập tin được tạo ra. Ngôn ngữ BATCH tuy đơn giản nhưng có thể tạo ra những chương trình hữu ích.

     

    Chúng ta tạo một tập tin BATCH (.bat) có lệnh FOR để đặt lại tên cho tập tin. Lệnh FOR được dùng để truyền lệnh cho một nhóm tập tin có cùng đặc điểm. Ví dụ ta có thể dùng lệnh này để chép tất cả các tập tin JPEG trong thư mục hiện hành thành những tập tin mới có tên được bắt đầu bằng từ tenban:
    "FOR %%M IN (*.JPG *.JPEG) DO COPY %%M tenban%%M"

    Đây là một lệnh lặp vòng. Biến (M) của lệnh FOR có thể là chữ hoa hay chữ thường nằm ngay sau hai dấu %%. Biến này được gán cho các giá trị khác nhau từ tập hợp nằm trong dấu móc đơn sau từ IN (*.JPG *.JPEG). Có bao nhiêu chuỗi ký tự trong tập hợp thì lệnh theo sau từ DO trong cú pháp lệnh được lặp lại bấy nhiêu lần (trong trường hợp này là lệnh COPY).

    Lệnh FOR trong DOS hay Windows 9x chỉ có vậy, nhưng trong Windows 2000/XP thì mạnh hơn nhiều. Bạn có thể đính cả ngày giờ và phần đuôi mở rộng vào tên mới của tập tin. Chúng ta hãy cùng nhau tìm hiểu khả năng này. Bằng Notepad, bạn hãy tạo một tập tin có tên là tenngay.bat có hai dòng sau:

    @ECHO OFF

    FOR %%V IN (%1) DO ECHO %%V [%%~tV] %%~xV

    Chạy tập tin này ở dấu nhắc lệnh:

    tenngay *.JPG.

     

    Kết quả là các tập tin có đuôi JPG trong thư mục hiện hành sẽ có thêm phần ngày/giờ trong dấu ngoặc đơn và phần tên mở rộng của tập tin ở phía sau. Việc này thực hiện được là nhờ lệnh FOR trong Windows 2000/XP cho phép một số từ hạn định trong biến của lệnh tạo ra các kết quả khác nhau. Khi thêm từ ~t trước một biến trong lệnh, kết quả trả về sẽ có thêm phần ngày/giờ như sau 05/16/03 09:54a. Nếu thêm từ ~x bạn sẽ có thêm phần mở rộng tập tin bao gồm cả thời gian bắt đầu. Đó là những thông tin chúng ta cần để xây dựng tên mới cho các tập tin, nhưng để có phần đính thêm ngày giờ "coi được", chúng ta cần phải gia công thêm một ít nữa.

    Với cú pháp chuyển dòng lệnh /F, lệnh FOR trong Windows 2000/XP có khả năng phân tích dòng chữ thành các từ riêng biệt. Nếu giá trị trong dấu móc đơn là một đặc trưng tệp, lệnh FOR sẽ phân tích mỗi dòng của mỗi tập tin phù hợp. Nếu đó là một chuỗi chữ (được đặt trong dấu móc kép), thì FOR sẽ chỉ phân tích chuỗi đó, đây chính là điều chúng ta cần.

    Theo mặc định, hàm phân tích này đơn giản trả về cho chúng ta từ được phân cách bằng khoảng trống đầu tiên từ mỗi dòng, thay biến của FOR bằng từ đó. Ta thêm tokens= từ hạn định để FOR /F tự tạo thêm biến nhằm giữ được nhiều từ và thêm delims= từ hạn định nhằm xác định ký tự phân cách từ.

    Bây giờ chúng ta cùng nhau thử bằng một chuỗi ngày/giờ cụ thể. Bạn hãy thay thế dòng thứ hai trong tập tin batch trên của bạn bằng dòng sau:

    FOR /F "tokens=1-5 delims=/: " %%J IN ("16/05/03 09:54a") DO ECHO %%J %%K %%L %%M %%N

    Lệnh này lấy ra năm từ đầu tiên của chuỗi trong dấu móc đơn, cắt chuỗi ở nơi có dấu /, dấu : và khoảng trống. %%J là biến của FOR đã được xác định, các biến từ %%K đến %%N được tự động tạo ra.

    Kết quả của dòng lệnh này sẽ trông như thế này: 16 05 03 09 54a. Định dạng tên tập tin mà chúng ta muốn dùng cho các tập tin hình sẽ được sắp xếp theo năm, tháng rồi ngày, sau đó không có khoảng trống, do vậy cần viết lại lệnh này ở đoạn cuối như sau:

    DO ECHO %%L%%K%%J_%%M%%N

    Bây giờ kết quả sẽ là 030516_0954a, rất thích hợp để ta đặt tên cho một tập tin.

    Bước tiếp theo là kết hợp hai kỹ thuật trên lại với nhau. Chúng ta đặt nhãn ngày/giờ của mỗi tập tin ở vị trí của chuỗi trong dấu móc đơn trên rồi tạo những tên tập tin mới dựa trên cơ sở kết quả được trả về. Lưu ý, đây hãy còn là một dòng lệnh đơn trong tập tin batch của bạn:

    FOR %%V IN (%1) DO FOR /F "tokens=1-5 delims=/: " %%J IN ("%%~tV") DO ECHO Rename "%%V" %%L%%K%%J_%%M%%N%%~xV

    Khi bạn đưa một kiểu tập tin vào tập tin batch, kết quả sẽ biểu hiện ra tên các tập tin theo ngày thích hợp. Sau khi kiểm tra xem lệnh hoạt động có đúng không, bạn chỉ cần xóa từ ECHO đi để chuyển từ chức năng hiển thị tên tập tin thành đặt lại tên tập tin.

    Còn một việc phức tạp cuối cùng cần làm. Nếu hai tập tin có cùng ngày giờ thì việc đặt lại tên cho tập tin thứ hai sẽ gây lỗi và chương trình bị dừng lại. Trừ khi chắc chắn không bao giờ có hai tập tin có cùng ngày giờ, bạn cần tránh không để chuyện này xảy ra. Như vậy cuối cùng chúng ta có một câu lệnh dài "không tưởng tượng nổi":

    FOR %%V IN (%1) DO FOR /F "tokens=1-5 delims=/: " %%J IN ("%%~tV") DO IF EXIST %%L%%K%%J_%%M%%N%%~xV (ECHO Cannot rename %%V) ELSE (Rename "%%V" %%L%%K%%J_%%M%%N%%~xV)

    Vậy là tập tin batch của chúng ta đã hoàn tất.

    Nhưng tập tin batch trên không phân biệt được giờ giữa buổi sáng (AM hay SA) và buổi chiều tối (PM hay CH). Việc này cũng dễ thôi. Bạn chỉ cần sửa lại ("tokens=1-6") để tạo thêm biến giữ từ và đưa biến %%O vào bất cứ nơi nào bạn cần có AM/PM hay SA/CH. Dòng lệnh trong tập tin batch bây giờ sẽ như sau:

    FOR %%V IN (%1) DO FOR /F "tokens=1-6 delims=/: " %%J IN ("%%~tV") DO IF EXIST %%L%%K%%J_%%M%%N%%O%%~xV (ECHO Cannot rename %%V) ELSE (Rename "%%V" %%L%%K%%J_%%M%%N%%O%%~xV)

    Để chạy tập tin này, ví dụ để đổi tên các tập tin trong thư mục nào đó, bạn mở My Computer, trong thanh Address, đánh vào: [drive:][path]tenngay [drive:][path]\*.jpg (*.jpg là tất cả các tập tin hình JPEG trong thư mục bạn muốn đổi tên tập tin)

    Bạn cũng có thể đổi dòng lệnh lại như sau:

    FOR %%V IN (*.jpg) DO FOR /F "tokens=1-6 delims=/: " %%J IN ("%%~tV") DO IF EXIST %%L%%K%%J_%%M%%N%%O%%~xV (ECHO Cannot rename %%V) ELSE (Rename "%%V" %%L%%K%%J_%%M%%N%%O%%~xV)

    Rồi chép tập tin trên vào thư mục hình JPG cần đổi tên tập tin và nhấn đúp lên nó là xong.

    Còn những tập tin có cùng cả ngày giờ phút và cùng buổi sáng hay chiều không chịu đổi tên? Tôi xin nhường cho các bạn nghiên cứu tiếp.

    Phạm Tuyên
    E-mail: tuyennam@dng.vnn.vn

    ID: A0603_128