Удалить определенные расширения из имени файла с несколькими расширениями - PullRequest
2 голосов
/ 08 апреля 2020

Я могу получить имя файла без расширения, используя 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 должны быть удалены?

Ответы [ 2 ]

2 голосов
/ 08 апреля 2020

Вы всегда можете искать точки вручную:

[~,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];
1 голос
/ 08 апреля 2020

Это удаляет все расширения:

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
...