Czy jest jakieś narzędzie do urldecode nazwy pliku i zastąpienia go?
Przykład:
$ ls
hello%20world.txt
$ urldecode *.txt
$ ls
hello world.txt
Nowy wpis na blogu obejmuje to z echo(1)
a 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
}
sed
i echo
może urldececode nazwę pliku tak:
$ echo -e "$(echo hello%20world+ok | sed 's/+/ /g;s/%\(..\)/\\x\1/g;s/\\x\(2[Ff]\)/%\1/g')"
hello world ok
Chcemy, aby była w stanie zamienić nazwy plików na nazwy plików, a nie nazwy ścieżek (tzn. Nie chcemy dodawać ukośników), więc zostawiamy w %2F
spokoju. (Mówiąc ściślej, zmieniamy \x2F
się w %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
Aby faktycznie zmienić nazwę plików w bieżącym katalogu:
$ 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
Jeśli oryginalne (wejściowe) nazwy plików zawierają ukośniki odwrotne, prawdopodobnie zostaną zniekształcone.
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.mp4
10%20-%205%20-%20Regularization%20and%20Bias%2FVariance%20%2811%20min%29.mp410%20-%205%20-%20Regularization%20and%20Bias%2FVariance%20%2811%20min%29
Myślę, że ten fragment Perla może służyć jako podstawa do tego, czego szukasz.
źródło
Wpisz shell (lub dodaj do .bashrc):
Stosowanie:
Testowane w bash, zsh. Kredyty .
źródło