thay đổi toàn bộ cây thư mục thành tên viết thường


12

Tôi đang làm việc trên một chuyển đổi trang web. Các tệp khi chúng được liên kết và phục vụ từ máy chủ web không phân biệt chữ hoa chữ thường. Nhưng, tôi đã tạo một trang web trên hệ thống linux của mình và tôi đang viết các tập lệnh để di chuyển dữ liệu. Vấn đề là tôi đang gặp vấn đề về độ nhạy trường hợp giữa các chuỗi liên kết trong các trang và trường hợp từ thực tế trên hệ thống tệp.

Ví dụ: một trang có thể có một liên kết như <a href='/subfolder/PageName.asp'>trong khi tệp thực tế là /subfolder/pagename.asp. Tương tự như vậy với hình ảnh - <img src='spacer_sm.gif'>có thể Spacer_Sm.gif.

Vì vậy, suy nghĩ của tôi là thay đổi tất cả các thư mục và tên tệp thành tương đương chữ thường của chúng để tải xuống trang web. Làm thế nào để tôi làm điều này (và có thể có một cách tốt hơn?)

Ngay cả khi có các lệnh unix có chuyển đổi phân biệt chữ hoa chữ thường, tôi đang sử dụng php, vì vậy không phải tất cả các lệnh của hệ thống tệp đều có các tùy chọn cho độ nhạy trường hợp.


2
Xem một câu hỏi tương tự trước đó . Tôi đã đăng lại một câu trả lời đơn giản hơn ở đây vì câu hỏi cụ thể hơn một chút.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


8

Tôi không biết liệu hương vị unix của bạn có a rename. Nhiều Linux có và nó là một phần của gói perl, nếu bạn tìm kiếm một kho lưu trữ.

find ./ -depth -exec rename -n 'y/[A-Z]/[a-z]/' {} ";"

Phiên bản trên với

rename -n 

không thực sự thực hiện hành động, mà chỉ in những gì sẽ được thực hiện. Bạn bỏ qua -n để làm điều đó thực sự.


"Ngôn ngữ" hay regex là 'y/[A-Z]/[a-z]/'gì?
dùng394

Chà, vì renamelà một phần của một perlgói, tôi đoán perl, nhưng mẫu cũng được sử dụng sed, và có thể AWKlà tốt. Tôi chỉ biết sedim lặng. Tôi dịch ysang translatehoặc map, nhưng tôi không biết nguồn gốc của nhân vật.
người dùng không xác định

Phải là perl regex - Gilles trong câu trả lời của ông nói renamelà một kịch bản perl.
dùng394

Có, và bạn có thể sử dụng regex perl, để sửa đổi tên tệp, điều này không nhất thiết phải kết luận từ việc viết bằng perl, nhưng đó có thể là câu hỏi thú vị hơn.
người dùng không xác định

9

Zsh

zmv -o-i '(**/)(*)' '$1${2:l}'

Giải thích: zmvđổi tên các tệp khớp với mẫu theo văn bản thay thế đã cho. -o-ichuyển -itùy chọn cho mỗi mvlệnh dưới mui xe (xem bên dưới). Trong văn bản thay thế, $1, $2, vv, là những nhóm trong ngoặc đơn liên tiếp trong mẫu. **có nghĩa là tất cả các thư mục (phụ) *, đệ quy. Trận chung kết (/)không phải là một nhóm được ngoặc đơn mà là một vòng loại toàn cầu có nghĩa là chỉ khớp với các thư mục. ${2:l}chuyển đổi $2thành chữ thường.

Đổi tên

Ở đây tôi sử dụng tập lệnh đổi tên Perl mà Debian và Ubuntu /usr/bin/prenamecung cấp (thường cũng có sẵn rename). Với bash ≥4 hoặc zsh:

shopt -s globstar  # only in bash
rename 's!/([^/]*/?)$!\L/$1!' **/*

Với các loại đạn khác:

find . -depth -exec rename -n 's!/([^/]*/?)$!\L/$1!' {} +

Di động

Đệ quy:

find . -depth -exec sh -c '
    t=${0%/*}/$(printf %s "${0##*/}" | tr "[:upper:]" "[:lower:]");
    [ "$t" = "$0" ] || mv -i "$0" "$t"
' {} \;

Việc sử dụng -depthđảm bảo rằng các thư mục lồng nhau sâu được xử lý trước tổ tiên của chúng.


1

Nó không hoạt động trên cấu trúc thư mục sau:

JKL/
deF/
ABC/DEf
ABC/gHi
ghi/jkL

Đây là một ví dụ hoạt động:

for i in `find | sort -r | sed '$d'`; do \
   b=${i%/*}; e=${i##*/}; mv $i $b'/'${e,,}; done

Đối với một lời giải thích trên bevars:

man bash

Sau đó sử dụng chuỗi khóa sau: /,,Enterbb


0

Câu trả lời được chấp nhận không có tác dụng với tôi vì nó đã cố gắng thay đổi tất cả các thư mục cùng một lúc. Tôi đã tìm thấy một giải pháp khác trên stackexchange rất giống với giải pháp di động từ Gilles ở trên: từ Baramin -
/programming/4268591/unix-rename-files-directories-to-uppercase

Tôi đã sao chép nó ở đây:

find . -depth | \
while read LONG; do
   SHORT=$( basename "$LONG" | tr '[:lower:]' '[:upper:]' )
   DIR=$( dirname "$LONG" )
   if [ "${LONG}" != "${DIR}/${SHORT}"  ]; then
     mv "${LONG}" "${DIR}/${SHORT}"
   fi
done

Tôi đã thay đổi lệnh tr thành tức là: sed s / cat / dog / g

Mọi lời cảm ơn đến Baramin tại link trên.ie

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.