Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Bash中追加和重命名文件_Bash_Unix - Fatal编程技术网

在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的