Sử dụng cái này với bash
:
find $1 -name "* *.xml" -type f -print0 | \
while read -d $'\0' f; do mv -v "$f" "${f// /_}"; done
find
sẽ tìm kiếm các tập tin với một khoảng trắng trong tên. Tên tệp sẽ được in bằng nullbyte ( -print0
) dưới dạng dấu phân cách để đối phó với tên tệp đặc biệt. Sau đó, phần read
dựng sẵn đọc tên tệp được phân định bởi nullbyte và cuối cùng mv
thay thế khoảng trắng bằng dấu gạch dưới.
EDIT: Nếu bạn cũng muốn xóa các khoảng trắng trong các thư mục, nó phức tạp hơn một chút. Các thư mục được đổi tên và sau đó không thể truy cập được bằng tên find
tìm thấy. Thử đi:
find -name "* *" -print0 | sort -rz | \
while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
Việc sort -rz
đảo ngược thứ tự tệp, sao cho các tệp sâu nhất trong một thư mục là lần đầu tiên di chuyển và chính thư mục đó sẽ là thư mục cuối cùng. Vì vậy, không bao giờ có thư mục được đổi tên trước khi tất cả các tệp và thư mục được đổi tên bên trong nó. Các mv
lệnh trong vòng lặp là một chút thay đổi quá. Trong tên đích, chúng tôi chỉ xóa các khoảng trắng trong tên cơ sở của tệp, nếu không nó sẽ không thể truy cập được.