Câu hỏi Tự động rút ngắn đường dẫn qua giới hạn số ký tự trong bash


Windows và các công cụ chạy trên các máy chủ Windows (ví dụ: OneDrive) có giới hạn về độ dài đường dẫn.

Tôi đang tìm một công cụ dòng lệnh trong OSX / Linux / Unix đến, trong một thư mục, rút ​​ngắn tất cả các đường dẫn trên một ngưỡng chiều dài đường dẫn, ví dụ, bằng cách giữ 5 ký tự đầu tiên và 5 ký tự cuối cùng của mỗi tên thư mục / tệp đường dẫn quá dài, bắt đầu bằng tên của các thư mục và tệp xa nhất từ ​​gốc (ví dụ: lồng nhau nhiều nhất).

I E

folder_very_very_long_name/folder_very_very_long_name/folder_very_very_long_name/file_very_very_long_name

có thể trở thành

folder_very_very_long_name/folder_very_very_long_name/folde_name/file__name

Tôi đã có thể xác định các đường dẫn phiền hà bằng cách sử dụng:

find . -name \* -type f | perl -ne 's/(.*)/print length($1), " $1\n"/e' | sort -nu

từ:

https://discussions.apple.com/thread/2590442?tstart=0


1
2017-07-23 12:22


gốc


Bạn muốn làm gì nếu folder_very_very_long_name/folder_very_very_long_name/folde_name/file__name đã tồn tại? - Andrew Morton


Các câu trả lời:


lp="folder_very_very_long_name/folder_very_very_long_name/folder_very_very_long_name/file_very_very_long_name"

IFS='/' read -a components <<< "$lp"

combined_path=""

for comp in "${!components[@]}"
do
    if [ ${#components[$comp]} -gt 0 ]; then
        a=$(echo ${components[$comp]} | cut -c -5);
        b=$(echo ${components[$comp]} | tail -r -c 6);
        if [ $comp -eq 0 ]; then
            combined_path="$a...$b"
        else
            combined_path="$combined_path/$a...$b"
        fi
    fi
done
echo $combined_path

Kết quả ví dụ:

folde..._name/folde..._name/folde..._name/file_..._name

Giải trình:

IFSlà dấu phân cách của bạn; bạn đã đọc lp và lưu trữ từng phần của chuỗi được chia nhỏ trong mảng components.

Sau đó, bạn lặp qua từng phần tử trong mảng của mình, sử dụng câu lệnh if để kiểm tra xem phần tử tương ứng comp trống rỗng, do đó cho biết đường dẫn bắt đầu từ gốc. Sử dụng cut bạn nhận được 5 ký tự đầu tiên và sử dụng tail cuối cùng 5. Sau đó bạn nối thêm vào con đường tổng thể của bạn combined_path, ghép lại a và b với ... giữa hai người. (Đó là chỉ để làm cho việc rút ngắn rõ ràng hơn và có thể dễ dàng bị bỏ sót).

Hy vọng điều này sẽ giúp bạn tiến gần hơn đến giải pháp mong muốn của mình.


1
2017-07-25 18:51