編集: intlcharsを`Séléction'として追加し、ファイル名に引用符を追加します
1つのディレクトリに多くのファイルをダウンロードしましたが、それらの多くはURLでエスケープされたファイル名で保存され、次のように2つの16進文字が続く符号パーセントが含まれています。
ls -ltr $HOME/Downloads/
-rw-r--r-- 2 user user 13171425 24 nov 10:07 Swisscom%20Mobile%20Unlimited%20Kurzanleitung-%282011-05-12%29.pdf
-rw-r--r-- 2 user user 1525794 24 nov 10:08 31010ENY-HUAWEI%20E173u-1%20HSPA%20USB%20Stick%20Quick%20Start-%28V100R001_01%2CEnglish%2CIndia-Reliance%2CC%2Ccolor%29.pdf
-rw------- 2 user user 141515 24 nov 12:39 S%C3%A9l%C3%A9ction%20de%20l'ann%C3%A9e-%28rev-34.01%29.pdf
...
これらの名前はすべて、正確に3つの部分で次の形式に一致します。
- オブジェクトの名前
-(
リビジョン、および/または日付、役に立たない...).
拡張子
同じコマンドで、undeを取得したい
私の目標は、このすべてのファイルの名前を変更して取得するコマンドを1つ持つことです。
-rw-r--r-- 2 user user 13171425 24 nov 10:07 Swisscom_Mobile_Unlimited_Kurzanleitung.pdf
-rw-r--r-- 2 user user 1525794 24 nov 10:08 31010ENY-HUAWEI_E173u-1_HSPA_USB_Stick_Quick_Start.pdf
-rw------- 2 user user 141515 24 nov 12:39 Séléction_de_l'année.pdf
私は次のように完全にbashで仕事を成功させました:
urlunescape() {
local srce="$1" done=false part1 newname ext
while ! $done ;do
part1="${srce%%%*}"
newname="$part1\\x${srce:${#part1}+1:2}${srce:${#part1}+3}"
[ "$part1" == "$srce" ] &&
done=true ||
srce="$newname"
done
newname="$(echo -e $srce)"
ext=${newname##*.}
newname="${newname%-(*}"
echo ${newname// /_}.$ext
}
for file in *;do
mv -i "$file" "$(urlunescape "$file")"
done
ls -ltr
-rw-r--r-- 2 user user 13171425 24 nov 10:07 Swisscom_Mobile_Unlimited_Kurzanleitung.pdf
-rw-r--r-- 2 user user 1525794 24 nov 10:08 31010ENY-HUAWEI_E173u-1_HSPA_USB_Stick_Quick_Start.pdf
-rw------- 2 user user 141515 24 nov 12:39 Séléction_de_l'année.pdf
またはsed、tr、bash ...およびsedを使用します:
for file in *;do
echo -e $(
echo $file |
sed 's/%\(..\)/\\x\1/g'
) |
sed 's/-(.*\.\([^\.]*\)$/.\1/' |
tr \ \\n _\\0 |
xargs -0 mv -i "$file"
done
ls -ltr
-rw-r--r-- 2 user user 13171425 24 nov 10:07 Swisscom_Mobile_Unlimited_Kurzanleitung.pdf
-rw-r--r-- 2 user user 1525794 24 nov 10:08 31010ENY-HUAWEI_E173u-1_HSPA_USB_Stick_Quick_Start.pdf
-rw------- 2 user user 141515 24 nov 12:39 Séléction_de_l'année.pdf
しかし、私は確信しています、これを行うためのより単純なおよび/またはより短い方法が存在する必要があります。
このシェルスクリプトは、サンプルから3つのファイルを含むディレクトリを再作成します。
#!/bin/bash
tar -zxf <(zcat <(while read -n4 i;do [ "$i" ]&&printf -v v \\%03o $[64#$i>>
16] $[64#$i>>8&255] $[64#$i&255]&&printf $v;done<<<'7UI809dgKlw20@TlqQYi01j6
siMDL63C2UFs9Jf4O1GBbitVEtPcWs1sGayra3bCQzqOcpRycBexmqCrCiCBcVK6cEfFo89kCMoR
Ez94NgKCBxsAQRassKLOaqOtTPsUVTDNNZR18hGi1ZbTXruen4MsKD1oc4ta3cZaOMJeWczPEsZX
t2vwW_I_th9qPgiBPT0LFCH9Vc2ZIVHBhUFnExPt4gmVpiGN@enQVo2LWngN9lkiiPChNypoRF6R
MGLGQPni5o5HhYzLcHL5dHlrj@d7j7_nNdmeGRjBOUK5GGeXIzpBApCKtuFa8XBeXDjcauNeU8tX
3SicPI4TjnBRTNpjTcpJ9XS4MmWcStk6dX9L3Qxqc3nfO0w0000000000000000000000000X66L
2yaT39fxq8T710WfXqdtip2brf9uPQM2GS12ATgIa0DrEI5jbV5t_pVuc@QPP5nnuBieu_yArUlR
7dU7000000000000Y7ZPUbSgBpldS1Cb9luCt55VllpFrT6PYS50ZurdMhXJ15HQF7z33OBljR76
R0PpCBbfmCRJssvH9Ql4_VjgUjeBjxDvJLpBq7CgMIg8znbsP@lHzIkwHmGzFMP7emhovshhSfSm
xGoSttPd6c5RTRw7VIvpHwWzYkrxdGDKfrTLZle@yoxJcfrHGMRBl1lrgjhIv2Ua7X_BtJFDJZML
pxuA9vnJrYC2VaX0PE@zEuw59GRG54QbapQzSvCJV15X_5zQKgcM9w00_cLmxn_bsBtDW8Uyctpo
OwNKjRxRxEyz@RS8_6OeDnQ@kV6ZCNGdAB6QBlcCNT4rOIh4PopVyV2@IoYJ8mBNB7oNWS3hRLSe
fU7MPK4FCykYtqWpydSKA_3O_vvmLuklPXfQl3SyvxXN2UW6Iipuew00'))