请问一个关于文件改名的问题

请问一个关于文件改名的问题

某个目录下面有一些文件,我想把某些具有特定关键字的文件改名,请问该如何处理?
具体地说,比如目录下有a.txt,_2_a.txt,_3_c.txt文件,我想把以"_"开头的文件提取出来单独处理:首先先存下两个"_"之间的数值作为文件夹名称,再把删除"_*_"前缀的该文件存到这个文件夹下,就是_2_a.txt变成 a.txt存到/2/文件夹下,_3_c.txt变成 c.txt存到/3/文件夹下。

请问该如何编程处理?谢谢!      
是不是应该首先"for file in `find \-name "xx""` do"命令找到所有的_开头的文件?但是怎么写呢?      
i dont think its diffcult. try and then ask      
[QUOTE=dearvoid]i dont think its diffcult. try and then ask[/QUOTE]谢谢……我试了两个小时,可是连最简单的第一步,找到"_"开头的文件都没有实现。。因为之前不大了解shell编程。能给点提示吗?//bow      
[QUOTE=dearvoid]i dont think its diffcult. try and then ask[/QUOTE]我试了这个:
for file in *
do
case $file in
_*_* )
        
echo $file
     ;;
esac
done

可以提取_2_a.txt之类的文件了,但是怎么把前缀去掉并且存在/2/下呢?      
复制内容到剪贴板
代码:
[0 No.2019 root@deb /tmp/work]# ls
_2_a.txt  _3_c.txt

[0 No.2020 root@deb /tmp/work]# for f in _*;do
dir=$(echo $f | sed 's/_\(.*\)_.*/\1/')
file=$(echo $f | sed 's/.*_//')
mkdir $dir
mv $f $dir/$file
done

`_2_a.txt' -> `2/a.txt'
`_3_c.txt' -> `3/c.txt'

[0 No.2021 root@deb /tmp/work]# ls -R
.:
2/  3/

./2:
a.txt

./3:
c.txt

[0 No.2022 root@deb /tmp/work]#                                 
      
谢谢!真的是用sed啊。我再研究研究,//bow!      
我用脚本找到了_**_中间的数字,可是mkdir的时候出错了..为什么呢?程序就是在你的基础上作了小改动。
for f in _*; do
echo "file" $f
dir = $(echo $f | sed 's/_\([0-9]*\)_.*/\1/')
echo "dir" $dir
file = $(echo $f | sed 's/.*|//')
mkdir $dir
#mv $f $dir/$file
done
运行结果如下:

$./test
file _1_a.txt
dir: =:No such file or directory
dir: 1:No such file or directory
dir
=:    cannot open `='(No such file directory)
mkdir: missing operand
try `mkdir --help' for more information.




[QUOTE=li-jiahuan]
复制内容到剪贴板
代码:
[0 No.2019 root@deb /tmp/work]# ls
_2_a.txt _3_c.txt

[0 No.2020 root@deb /tmp/work]# for f in _*;do
dir=$(echo $f | sed 's/_\(.*\)_.*/\1/')
file=$(echo $f | sed 's/.*_//')
mkdir $dir
mv $f $dir/$file
done

`_2_a.txt' -> `2/a.txt'
`_3_c.txt' -> `3/c.txt'

[0 No.2021 root@deb /tmp/work]# ls -R
.:
2/ 3/

./2:
a.txt

./3:
c.txt

[0 No.2022 root@deb /tmp/work]#
[/QUOTE]      
我错了……=左右不能有空格……一滴汗      
也不是非要sed
there is more than one way to do it
复制内容到剪贴板
代码:
[0 No.2002 huan@deb ~]$ str='_2_a.txt'

[0 No.2003 huan@deb ~]$ dir=${str/_/};dir=${dir%_*};echo $dir
2

[0 No.2004 huan@deb ~]$ file=${str##*_};echo $file
a.txt

[0 No.2005 huan@deb ~]$      
复制内容到剪贴板
代码:
[0 No.2016 huan@deb ~]$ perl -e '$_ = "_2_a.txt"; print "dir: $1\nfile:$2\n" if (/_(.*)_(.*)/) '
dir: 2
file:a.txt

[0 No.2017 huan@deb ~]$