在Bash中追加和重命名文件
我有一份档案在Bash中追加和重命名文件,bash,unix,Bash,Unix,我有一份档案 sandeep_mems_SJ_23102003.txt需要重命名的SJ_新成员_SJ_23102003.txt 我每天都会收到这些文件,所以在SJ之后的任何事情都保持不变是至关重要的 到目前为止,我得到了以下信息:- for each in `/bin/ls -1`;do sed -i 's/sandeep_mems_SJ/sj_new_members/g' $each ; done 您可以使用重命名实用程序: rename 's/sandeep.*?_(\d+\.txt)
sandeep_mems_SJ_23102003.txt
需要重命名的SJ_新成员_SJ_23102003.txt
我每天都会收到这些文件,所以在SJ之后的任何事情都保持不变是至关重要的
到目前为止,我得到了以下信息:-
for each in `/bin/ls -1`;do
sed -i 's/sandeep_mems_SJ/sj_new_members/g' $each ;
done
您可以使用
重命名
实用程序:
rename 's/sandeep.*?_(\d+\.txt)$/sj_new_members_$1/' sandeep*txt
您可以使用
重命名
实用程序:
rename 's/sandeep.*?_(\d+\.txt)$/sj_new_members_$1/' sandeep*txt
sed
将在您更改文件内容时提供帮助。要重命名文件本身,可以执行以下操作:
适用于每个in*;做
mv$每个sj_新成员${每个###sandeep_mems_sj}
完成
我使用*而不是/bin/ls,因为它避免产生额外的进程,并使用Bash的内置匹配(globbing)机制
每个文件名都分配给$Each
mv
使用Bash的子字符串机制将$each
重命名为sj_new_members\uu
,后跟所需的$each
子字符串。有关如何使用Bash子字符串的更多详细信息,请参见:
另外,这里还有一个使用cut
命令的替代方法,该命令沿指定的字符分隔符拆分,在本例中为\uuu
。我不太喜欢它,因为它产生了一个新的过程,但它是有效的。查看cut
手册页了解更多详细信息。请注意,$(command)
等同于使用反勾号——它在子shell中运行命令
适用于每个in*;做
mv$每个sj_new_members_$(cut-d'-f 3-sed
将在您更改文件内容时对您有所帮助。要重命名文件本身,您可以执行以下操作:
适用于每个in*;do
mv$每个sj_新成员${每个###sandeep_mems_sj}
完成
我使用*而不是/bin/ls,因为它避免产生额外的进程,并使用Bash的内置匹配(globbing)机制
每个文件名都分配给$Each
mv
使用Bash的子字符串机制,将$each
重命名为sj_new_members\
,后跟所需的$each
子字符串。有关如何使用Bash子字符串的更多详细信息,请参见:
另外,这里还有一个使用cut
命令的替代方法,该命令沿着指定的字符分隔符进行分割,在本例中为\uu
。我不太喜欢它,因为它产生了一个新的进程,但它可以工作。有关详细信息,请查看cut
手册页。注意$(命令)
等同于使用backticks——它在子shell中运行命令
适用于每个in*;do
mv$每个sj_新成员$(切割-d'-f 3-
##*SJ
是参数扩展的语法,用于删除直到最后一个SJ
为止的所有内容。尚未测试全部内容,但它应该可以工作
##*SJ
是参数扩展的语法,用于删除直到最后一个SJ
为止的所有内容。虽然没有测试全部内容,但它应该可以工作。我尝试尽可能多地复制您的函数,因此这里有一个实现sed
的解决方案:
for each in *; do
new=$(echo "$each" | sed 's/.*_SJ/sj_new_members_SJ_/')
mv $each $new
done
我认为您实际上不需要使用ls-1
命令,因为sed
将更改包含上述要求的文件的文件名
本质上,我的命令所做的是将新文件名保存在变量中,new
,然后mv
将其重命名为保存在变量中的文件名。我尝试尽可能多地复制您的函数,因此这里有一个实现sed
的解决方案:
for each in *; do
new=$(echo "$each" | sed 's/.*_SJ/sj_new_members_SJ_/')
mv $each $new
done
我认为您实际上不需要使用ls-1
命令,因为sed
将更改包含上述要求的文件的文件名
本质上,我的命令所做的是将新文件名保存在变量中,new
,然后mv
将其重命名为保存在变量中的文件名。实际上,它没有。这将帮助您处理文件内容,而不是文件名本身。将重新编辑。编辑以更好地解决此问题。不过,出于好奇,regar丁:我的原始答案是:当你使用sed s//
时,在\(
和\)
中包含的左侧(搜索字段)的任何内容都可以使用\1
在右侧(替换字段)复制。这些偏执不被视为搜索的一部分。如果你有多个\(\)
在左侧,则它们可以作为\2
、\3
等,从左侧开始计算每个\(
。这些被称为backreferences。谢谢。你能解释一下修改后的代码版本是如何工作的吗?重新编辑以包含更好的、全bash的解决方案和更多的注释。事实上,它没有。这将帮助你处理文件内容,而不是文件名本身。将重新编辑。编辑以更好地解决这个问题。出于好奇,你gh,关于我的原始答案:当您使用sed s//
时,包含在\(
和\)
中的左侧(搜索字段)的任何内容都可以使用\1
在右侧(替换字段)复制。这些偏执不被视为搜索的一部分。如果您有多个\(\)
在左侧,则它们可以作为\2
、\3
等,从左侧开始计算每个\(
。这些被称为backreferences。谢谢。您能解释一下修改后的代码版本是如何工作的吗?重新编辑以包含更好的、全bash的解决方案和更多的注释。我会升级投票,因为我从中学到了一些新的东西,它看起来很有用,但不会这样做,因为重命名
命令在BS上似乎不可用D型系统(或至少是OS X),这个问题一般都是针对Bash的。我会投票,因为我从中学到了一些新东西,它看起来很有用,但不会这么做,因为rename
命令在BSD型系统(或至少是OS X)上似乎不可用,而这个问题是针对Ba的