Đổ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/' '{}' \;
-execdir
Tùy chọn tuyệt vời thực hiện một cd
vào thư mục trước khi thực hiện rename
lệ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 PATH
hack là bắt buộc vì -execdir
có một nhược điểm rất khó chịu: find
cực kỳ quan tâm và từ chối làm bất cứ điều gì -execdir
nếu bạn có bất kỳ đường dẫn tương đối nào trong PATH
biến môi trường của mình , ví dụ: ./node_modules/.bin
thấ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
-execdir
là một phần mở rộng tìm GNU cho POSIX . rename
là dựa trên Perl và đến từ rename
gó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 find
hoặ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 -execdir
vớ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 -r
yê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.
rename
hay Red Hatrename
không?