Tên tệp mã urldecode của Linux


2

Có công cụ nào để mã hóa tên tệp và thay thế nó không?

Thí dụ:

$ ls
hello%20world.txt
$ urldecode *.txt
$ ls
hello world.txt

Câu trả lời:


1

Một bài đăng blog mới bao gồm điều này với echo(1)printf(1).

urldecode() {
  arg="$1"
  i="0"
  while [ "$i" -lt ${#arg} ]; do
    c0=${arg:$i:1}
    if [ "x$c0" = "x%" ]; then
      c1=${arg:$((i+1)):1}
      c2=${arg:$((i+2)):1}
      printf "\x$c1$c2"
      i=$((i+3))
    else
      echo -n "$c0"
      i=$((i+1))
    fi
  done
}

3

sedechocó thể mã hóa tên của một tệp như vậy:

$ echo -e "$(echo hello%20world+ok | sed 's/+/ /g;s/%\(..\)/\\x\1/g;s/\\x\(2[Ff]\)/%\1/g')"
hello world ok

Chúng tôi muốn điều này có thể biến tên tệp thành tên tệp, thay vì tên đường dẫn (nghĩa là chúng tôi không muốn thêm dấu gạch chéo), vì vậy chúng tôi để %2Fyên. (Để được chính xác hơn, chúng tôi quay \x2F trở lại vào %2F.)

$ echo -e "$(echo cat+dog%20foo%21%22%23%24%25%26%27%28%29%2A%2B%2C%2D%2E%2Fbar |
                                    sed 's/+/ /g;s/%\(..\)/\\x\1/g;s/\\x\(2[Ff]\)/%\1/g')"
cat dog foo!"#$%&'()*+,-.%2Fbar

Để thực sự đổi tên các tập tin trong thư mục hiện tại:

$ ls *.txt
hello%20%20world++ok?.txt
$ for f in *.txt; do 
>   mv "$f" "$(echo -e "$(echo "$f" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;s/\\x\(2[Ff]\)/%\1/g')")"
> done
$ ls *.txt
hello  world  ok?.txt

Nếu tên tệp (đầu vào) ban đầu chứa dấu gạch chéo ngược, chúng có thể sẽ bị sai lệch.


Ý tưởng ở đây là biến trực tiếp '+' thành khoảng trắng và biến% dấu hiệu thành '\ x' thoát, sau đó để echo diễn giải \ x thoát bằng cách sử dụng tùy chọn '-e'. Hãy thử chạy "echo -e 'hello \ x20world'" để thấy điều này hoạt động.
Ức chế lửa

Làm thế nào về phần mà nó đổi tên tập tin?
SamB

@SamB: còn lại như một bài tập cho người đọc :-)
Suppressingfire

Có vẻ như nó không hoạt động trong mọi trường hợp, tên tệp không thành công: 10%20-%203%20-%20Model%20Selection%20and%20Train%2FValidation%2FTest%20Sets%20%2812%20min%29.mp410%20-%203%20-%20Model%20Selection%20and%20Train%2FValidation%2FTest%20Sets%20%2812%20min%29.mp4hoặc10%20-%205%20-%20Regularization%20and%20Bias%2FVariance%20%2811%20min%29.mp410%20-%205%20-%20Regularization%20and%20Bias%2FVariance%20%2811%20min%29
kenorb


1

Nhập shell (hoặc thêm vào .bashrc):

urldecode(){
    mv $1 "`echo $1 | xargs python -c "import urllib, sys; print urllib.unquote(sys.argv[1])"`"
}

Sử dụng:

$ urldecode *.txt

Đã thử nghiệm trong bash, zsh. Tín dụng .

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.