在Bash中追加和重命名文件

时间:2015-01-30 15:18:50

标签: bash unix

我有一个档案 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

4 个答案:

答案 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将其重命名为保存在变量中的文件名。