我有下一个文件列表:
~$: find . -type f -exec md5sum {} \;
2a1731ae57fb17659b21f180f9fcbebd ./temp.rd1
f792fb6f13996a91d1ccbe2a8e3242fc ./temp2.rd1
f792fb6f13996a91d1ccbe2a8e3242fc ./older1/temp.rd2
b69997ffce70ec116b7f46eabdfc7040 ./older1/sub/temp.rd1
d757a18d4a3c11c2a9a45e2f3815d3a1 ./older2/temp.rd3
d79cc7e5f45852b79ddc896cc8e2b58c ./older3/temp.rd3
左列包含右栏中显示的文件的md5总和。我需要用下一种方式重命名文件:
./2a1731ae57fb17659b21f180f9fcbebd.rd1
./f792fb6f13996a91d1ccbe2a8e3242fc.rd1
./older/f792fb6f13996a91d1ccbe2a8e3242fc.rd2
./older/sub/b69997ffce70ec116b7f46eabdfc7040.rd1
./older2/d757a18d4a3c11c2a9a45e2f3815d3a1.rd3
./older3/d79cc7e5f45852b79ddc896cc8e2b58c.rd3
我想用sed完成这个:
sed -e 's/\([^ ]*\) \(.*\(\..*\)\)$/mv -v \2 \1\3/e'
这会重命名文件,但路径中的目录会丢失,所以我正在寻找一种正确的方法(使用sed或awk)。
答案 0 :(得分:1)
使用awk
获得更简单的解决方案:
我为这项工作创建了一个额外的.sh
文件:
#!/bin/sh
MD5=$(md5sum "$1" | awk '{print $1'})
DIR=${1%/*}
FN=${1##*/}
EXT=${FN##*.}
if [ -n "$EXT" ]; then
mv "$1" "$DIR/${MD5}.$EXT"
else
mv "$1" "$DIR/${MD5}"
fi
保存并chmod 777
,然后运行
find . -type f -exec rename-file.sh {} \;
答案 1 :(得分:1)
这可能适合你(GNU sed):
webview.setNetworkAvailable(true)
使用反向引用重新排列每一行,然后评估生成的命令。
N.B。也许更安全的方法是删除sed -r 's|^\s*(\S+)\s*((\.(/[^/]*)*/)[^.]*(\..*))|mv \2 \3\1\5|e' file
标志并捕获文件中的输出。然后在检查后将文件传输到shell。