【问题标题】:Remove certain extensions from filename with multiple extensions从具有多个扩展名的文件名中删除某些扩展名
【发布时间】:2020-07-20 09:36:50
【问题描述】:

我可以使用fileparts获取不带扩展名的文件名

>> f = '/foo/bar/file.gz'
>> [~,filename,~] = fileparts(f)
filename =

    'file'

但是,如果文件有多个扩展名,则只会删除最后一个

>>f = '/foo/bar/file.gz.tar'
>>[~,filename,~] = fileparts(f)
filename =

    'file.gz'

我知道文件扩展名可能包含多个点是模棱两可的,但有没有办法可以指定,例如,.gz.gz.tar 都应该被删除?

【问题讨论】:

    标签: string matlab file split


    【解决方案1】:

    您始终可以手动搜索点:

    [~,filename,~] = fileparts(f);
    i = find(filename == '.', 1, 'first');
    if ~isempty(i)
        filename = filename(1:i - 1);
    end
    

    或者您可以迭代 fileparts 直到它停止更改名称:

    [~, filename, ~] = fileparts(f);
    prev = '';
    while ~strcmp(prev, filename)
        prev = filename;
        [~, filename, ~] = fileparts(prev);
    end
    

    如果您要删除确切的扩展名,则要简单得多。只需检查名称是否以该序列结尾,并根据需要删除尽可能多的字符。对于.tar.gz 示例:

    ext = '.tar.gz';
    n = numel(ext);
    if numel(f) >= n && all(f(end - n + 1:end) == ext)
        f = f(1:end - n);
    end
    [~, filename, ext] = fileparts(f);
    filename = [filename ext];
    

    【讨论】:

    • 感谢@MadPhysicist,但是如果文件看起来像file.abc.gz.tar 并且我想检索file.abc 怎么办?如何指定我只希望删除特定的扩展名(例如 .gz.tar.gz)?
    • @HappyPy:这很不切实际。您必须明确列出所有可能的扩展名,但您无法将它们全部列出。
    • @HappyPy .abc 也是一个扩展
    • @HappyPy。希望我所做的更新能回答您的问题。
    【解决方案2】:

    这会删除所有扩展:

    f = '/foo/bar/file.gz.tar';
    path = fileparts(f);                % get folder path
    fileWithExt = erase(f,[path '/']);  % erase folder path from full path
    fparts = strsplit(fileWithExt,'.'); % split string at dot
    file = fparts{1};                   % get first entry
    

    这只会删除选择的扩展:

    f = '/foo/bar/file.gz.tar.abc.xyz';
    exts = {'tar','xyz'};               % extensions to remove
    
    path = fileparts(f);                % get folder path
    fileWithExt = erase(f,[path '/']);  % erase folder path from full path
    fparts = strsplit(fileWithExt,'.'); % split string at dot
    mask = ismember(fparts,exts);       % mask of extensions to remove
    file = strjoin(fparts(~mask),'.');  % stitch string back together
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      相关资源
      最近更新 更多