我有一个档案
sandeep_mems_SJ_23102003.txt
需要重命名为sj_new_members_SJ_23102003.txt
我每天都会收到这些文件,所以_SJ之后的任何内容都保持不变。
到目前为止,我已经得到以下信息: -
for each in `/bin/ls -1`;do
sed -i 's/sandeep_mems_SJ/sj_new_members/g' $each ;
done
答案 0 :(得分:2)
sed
会对您有所帮助。要重命名文件本身,您可以执行以下操作:
for each in *;do
mv $each sj_new_members_${each##sandeep_mems_SJ}
done
我使用*而不是/ bin / ls,因为它避免产生额外的进程并使用Bash的内置匹配(globbing)机制。
每个文件名都分配给$each
。
mv
使用Bash的子字符串机制将$each
重命名为sj_new_members_
,后跟您想要的$each
子字符串。有关如何使用Bash子串的更多详细信息,请访问:
http://tldp.org/LDP/abs/html/string-manipulation.html
此外,这是使用cut
命令的替代方法,该命令沿指定的字符分隔符分割,在本例中为_
。我不喜欢它,因为它产生了一个新的过程,但它的工作原理。查看cut
手册页以获取更多详细信息。请注意$(command)
与使用反引号相同 - 它在子shell中运行命令。
for each in *;do
mv $each sj_new_members_$(cut -d '_' -f 3- <<< $each)
done
答案 1 :(得分:2)
for each in `/bin/ls -1`;do
mv $each sj_new_members_SJ${each##*SJ}
done
##*SJ
是参数扩展的语法,用于删除上一个SJ
之前的所有内容。没有测试过整个东西,但它应该工作。
答案 2 :(得分:1)
您可以使用rename
实用程序:
rename 's/sandeep.*?_(\d+\.txt)$/sj_new_members_$1/' sandeep*txt
答案 3 :(得分:1)
我试图尽可能地复制你的功能,所以这是一个实现sed
的解决方案:
for each in *; do
new=$(echo "$each" | sed 's/.*_SJ/sj_new_members_SJ_/')
mv $each $new
done
我不相信您确实需要ls -1
命令,因为sed
会更改包含上述要求的那些文件的文件名。
实际上,我的命令所做的是将新文件名保存在变量new
中,然后mv
将其重命名为保存在变量中的文件名。