Câu trả lời:
Một bài đăng blog mới bao gồm điều này với echo(1)và 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
}
sedvà echocó 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.
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
Tôi nghĩ đoạn trích Perl này có thể được sử dụng làm cơ sở cho những gì bạn đang tìm kiếm.
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 .