String Bash重命名文件删除特定字符串之间的随机字符串
我想重命名(在bash中)以特定字符串“foo”开头的文件列表,以未指定长度的随机字符串“random1”继续,并以另一个已知字符串“bar”继续。基本上来自“foo_random1_bar_random2”,我想要“foo_bar_random2”。我知道如何使用sed删除特定字符串,但不知道特定字符串之间长度未知的字符串 使用BASH字符串替换:String Bash重命名文件删除特定字符串之间的随机字符串,string,bash,file,rename,String,Bash,File,Rename,我想重命名(在bash中)以特定字符串“foo”开头的文件列表,以未指定长度的随机字符串“random1”继续,并以另一个已知字符串“bar”继续。基本上来自“foo_random1_bar_random2”,我想要“foo_bar_random2”。我知道如何使用sed删除特定字符串,但不知道特定字符串之间长度未知的字符串 使用BASH字符串替换: f='foo_random1_bar_random2' echo "${f/*bar/foo_bar}" 注:根据下面的注释,如果在栏之前有下划
f='foo_random1_bar_random2'
echo "${f/*bar/foo_bar}"
注:根据下面的注释,如果在栏之前有下划线,则最好使用:
echo "${f/*_bar/foo_bar}"
输出:
foo_bar_random2
使用mv
作为:
for f in foo_*bar_*; do
mv -i "$f" "${f/*_bar/foo_bar}"
done
使用BASH字符串替换:
f='foo_random1_bar_random2'
echo "${f/*bar/foo_bar}"
注:根据下面的注释,如果在栏之前有下划线,则最好使用:
echo "${f/*_bar/foo_bar}"
输出:
foo_bar_random2
使用mv
作为:
for f in foo_*bar_*; do
mv -i "$f" "${f/*_bar/foo_bar}"
done
这显示了mv
命令的列表。一旦您对命令满意,请在mv
之前删除echo
,以便执行这些命令
这显示了mv
命令的列表。一旦您对命令满意,请在mv
之前删除echo
,以便执行这些命令。如果您安装了重命名
工具,则可以执行此操作
rename 's/foo_.*_bar/foo_bar/' files
如果安装了重命名
工具,则可以执行此操作
rename 's/foo_.*_bar/foo_bar/' files
这在foo_random1_bar_randombar2I上中断,在提供的示例中,我看不到这一点。如果有这样的可能性,我会调整它。“随机”对我来说似乎是相当广泛的输入;-)“${s/*\u bar/foo\u bar}”
很容易处理它,但是OP没有指定下划线总是在栏之前,正如您在回答中所假设的那样。但这不是重点。关键是,${f//}
只能对*
进行贪婪匹配。这在foo\u random1\u bar\u randombar2上出现了中断。在提供的示例中,我看不到这一点。如果有这样的可能性,我会调整它。“随机”对我来说似乎是相当广泛的输入;-)“${s/*\u bar/foo\u bar}”
很容易处理它,但是OP没有指定下划线总是在栏之前,正如您在回答中所假设的那样。但这不是重点。关键是${f//}
只能对*
进行贪婪匹配。