我有很多具有某种模式的文件:
some123_name4.with5.number01-02_and6-other7.stuff.txt
some123_name4.with5.number05-06_and6-other7.stuff.txt
some123_name4.with5.number11-12_and6-other7.stuff.txt
并且我想重命名它们将部分保留在中间数字?? - ?? 。例如:
different45_start.keep76.number01-02_but.change34_rest.txt
different45_start.keep76.number05-06_but.change34_rest.txt
different45_start.keep76.number11-12_but.change34_rest.txt
我玩过expr,%%和?但我甚至没有设法提取文件名的 number ?? - ?? 部分。
答案 0 :(得分:2)
应该这样做(用实际模式代替)
#!/bin/bash
for f in some123* ; do
mv $f `echo $f | sed -e 's/some123_name4.with5/different45_start.keep76/' -e 's/and6-other7.stuff/but.change34_rest/'`
done
答案 1 :(得分:1)
我建议您使用正则表达式将旧名称中的数字提取到新名称中吗?然后它只是一个关于
的问题在每次迭代中,
总而言之,这样的事情:
mkdir NEW
ls -1d some* \
| while read FILE; do
NEWFILE=`echo "$FILE" \
| sed 's|^some12\\([0-9]\\)_name\\([0-9]\\)[.]with\\([0-9]\\)[.]number\\([0-9][0-9]-[0-9][0-9]\\)_and\\([0-9]\\)-other\\([0-9]\\)[.]stuff[.]txt$|different\\2\\3_start.keep\\6\\5.number\\4_but.change\\1\\2_rest.txt|'`
cp "$FILE" NEW/"$NEWFILE"
done
正如您所看到的,由于反引号(`),您必须在正则表达式中使用额外的反斜杠。
作为一个开始,这对你有帮助吗?
答案 2 :(得分:1)
使用expr
的可能解决方案如下所示:
for f in *number??-??*; do
fixedPart=$(expr "$f" : '.*\(number[0-9][0-9]-[0-9][0-9]\).*')
newName="different45_start.keep76.${fixedPart}_but.change34_rest.txt"
mv "$f" "$newName"
done