0

我一直在努力让它工作一段时间......这个问题有所帮助,但我仍在努力让它发挥作用。我不想安装自制软件,因为这是我现在正在执行的一项罕见任务。

我有几千个文件,其中包含一串文本、一个下划线、更多文本、下划线,最后是我想要保留的重要文件名。尝试*_*_使用\(*\)/\1/.

我尝试了几种不同的方法,但我得到的只是原始文件名再次被吐出。任何帮助表示赞赏。- 不确定这是正则表达式问题,还是 sed,或者可能两者兼而有之。

ls | sed 's/^*_*_\(*\)/\1/' > ouput.txt;
ls | sed 's/^*_*_\(*\$\)/\1/' > out.txt
ls | sed 's/\(^*_*_\)\(*\$\)/\2/' > out.txt
ls | sed 's/\(^.*_+.*_+\)\(.*\$\)/mv & \2/' > out.txt
4

2 回答 2

2

这个正则表达式能解决问题吗?如果没有,请报告它的输出是如何关闭的(详细信息),我会帮你调整它。

ls -1 | sed -e 's/^[^_]*_[^_]*_//'

注意 1:您可能希望使用ls -1将文件格式化为单列。

注意 2:上述方法只是删除了文件名中不需要的部分,而不是尝试将您想要的部分存储在正则表达式缓冲区中。


编辑

这是一个执行重命名的 bash 脚本。

for f in `ls -1`
do
    new_name=`echo "$f" | sed 's/^[^_]*_[^_]*_//'`
    mv "$f" "$new_name"
done

可以写成单行,但我是为了简洁而不是简洁。

于 2012-09-12T23:47:15.173 回答
1

command | sed 's;^.*_;;'会成功的。使用find命令而不是ls.

例如,

 find . -type f | sed 's;^.*_;;' 
于 2012-09-12T23:52:28.230 回答