如何删除文件名的特定部分?

时间:2015-07-01 09:30:22

标签: bash shell ubuntu-14.04

我有像

这样的文件
#md0.xvg#
#md0.xvg# 
#md0.05.xvg#
#md0.05.edr#
#md0.1.edr#
#md0.1.xvg#
:    :
:    :

#md1.xvg#
#md.edr#

我想在没有#。

的情况下重命名它们
md1.xvg
md1.agr

我想用C或shell编写一个程序但是,我不知道如何开始。如果有人可以提供帮助,我将不胜感激。

5 个答案:

答案 0 :(得分:2)

您可以使用以下bash脚本或命令

$ rename 's/\#//g' * -v
  

重命名:命令

     

's / \#// g':替换表达式

     

* :所有文件

     

-v :详细

表达式详细信息:

   s    /  /#          /            / g
   ^       ^^              ^^^^^^     ^
Replace  # character with nothing   all

如果要进行空运行(不是实际重命名),请使用以下命令:

$ rename 's/\#//g' * -vn

它只会告诉现有的和新的(重命名的)文件名,并且赢了;不进行实际的重命名。

答案 1 :(得分:0)

使用tr(例如zsh)

% tr -d '#' <<EOF
heredoc> #md0.xvg#
heredoc> #md0.xvg# 
heredoc> #md0.05.xvg#
heredoc> #md0.05.edr#
heredoc> #md0.1.edr#
heredoc> #md0.1.xvg#
heredoc> :    :
heredoc> :    :
heredoc> #md1.xvg#
heredoc> #md.edr#
heredoc> EOF

结果将是

md0.xvg
md0.xvg 
md0.05.xvg
md0.05.edr
md0.1.edr
md0.1.xvg
:    :
:    :
md1.xvg
md.edr

没有 heredoc 的其他一些选项,假设包含您的数据的文件被称为yourfile.txt

% tr -d '#' < yourfile.txt
% cat yourfile.txt | tr -d '#'

使用>重定向将输出发送到另一个文件

% tr -d '#' < yourfile.txt > newfile.txt

答案 2 :(得分:0)

可以有很多方法。在C中,最简单的方法之一是使用数组索引来删除#。样本算法

  • 先决条件:文件名的格式为#......#
  • 目标:获取没有开始和结束#的文件名。
  • 算法:

    1. 将文件名读入数组,例如source_buffer
    2. 计算strlen(),存储到len(或其他)。
    3. 创建一个目标缓冲区(例如dest_buffer),它将保存修改后的文件名。
    4. 使用memcpy(dest_buffer, &source_buffer[1], len-2);
    5. null-terminate dest_buffer

或者,对于更复杂和更复杂的命名模式,您可以查看string.h标题中原型的字符串操作函数,如strchr()/strrchr()

答案 3 :(得分:0)

使用bash重命名

等文件
for i in ${files[@]}; do
    new_name=$(tr -d '#' $i)
    mv $i $new_name
done

或者,此C代码将从作为命令行参数提供的文件名中删除第一个和最后一个char

#include <stdio.h>
#include <string.h>

int main(int argc, char ** argv) {
    char * oldname = argv[1];
    char * newname = strdup(argv[1]);
    newname++;
    newname[strlen(newname) - 1] = 0;

    if (rename(oldname, newname))
        printf("Error: unable to rename the file");
    else
        printf("File renamed successfully");
    return 0;
}

答案 4 :(得分:0)

使用bash,您可以使用:

for i in ${files[@]}; do
    mv $i ${i//#/}
done

用c,您可以使用strtok()函数删除'#'然后删除mv。

strcpy(temp, path);    
token = strtok(path, "#");
system("mv temp token");