Đổi tên tập tin và thư mục với find -execdir | rename
Nếu bạn định đổi tên cả tệp và thư mục không chỉ đơn giản bằng hậu tố, thì đây là một mẫu tốt:
PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find . -depth -execdir rename 's/findme/replaceme/' '{}' \;
-execdirTùy chọn tuyệt vời thực hiện một cdvào thư mục trước khi thực hiện renamelệnh, không giống như -exec.
-depth đảm bảo rằng việc đổi tên xảy ra trước tiên đối với trẻ em và sau đó là cha mẹ để ngăn ngừa các vấn đề tiềm ẩn với các thư mục cha mẹ bị thiếu.
-execdir là bắt buộc vì đổi tên không chơi tốt với các đường dẫn đầu vào không phải là tên cơ sở, ví dụ như các lỗi sau:
rename 's/findme/replaceme/g' acc/acc
Việc PATHhack là bắt buộc vì -execdircó một nhược điểm rất khó chịu: findcực kỳ quan tâm và từ chối làm bất cứ điều gì -execdirnếu bạn có bất kỳ đường dẫn tương đối nào trong PATHbiến môi trường của mình , ví dụ: ./node_modules/.binthất bại với:
find: Đường dẫn tương đối './node_modules/.bin' được bao gồm trong biến môi trường PATH, không an toàn khi kết hợp với hành động -execdir của find. Vui lòng xóa mục nhập đó khỏi $ PATH
Xem thêm: https://askubfox.com/questions/621132/why-USE-the-execdir-action-is-insecure-for-directory-which-is-in-the-path/1109378#1109378
-execdirlà một phần mở rộng tìm GNU cho POSIX . renamelà dựa trên Perl và đến từ renamegói. Đã thử nghiệm trong Ubuntu 18.10.
Đổi tên cách nhìn
Nếu đường dẫn đầu vào của bạn không xuất phát findhoặc nếu bạn đã có đủ sự khó chịu của đường dẫn tương đối, chúng ta có thể sử dụng một số giao diện Perl để đổi tên thư mục một cách an toàn như trong:
git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'
Tôi đã không tìm thấy một chất tương tự thuận tiện cho việc -execdirvới xargs: xargs: thay đổi thư mục làm việc để đường dẫn tập tin trước khi thực hiện?
Các sort -ryêu cầu để đảm bảo rằng các tập tin đến sau khi các thư mục tương ứng của họ, kể từ khi con đường còn đi sau những ngắn hơn với tiền tố giống nhau.
renamehay Red Hatrenamekhông?