簡體   English   中英

從具有多個擴展名的文件名中刪除某些擴展名

[英]Remove certain extensions from filename with multiple extensions

我可以使用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

您始終可以手動搜索點:

[~,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];

這將刪除所有擴展:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM