【问题标题】:Select wav files from a folder whose partial names are in a text file从部分名称在文本文件中的文件夹中选择 wav 文件
【发布时间】:2026-02-16 05:45:02
【问题描述】:

我在文件夹 ABC 中有 500 个波形文件,它们的名称类似于

F1001
F1002
F1003
...
F1100
F2001
F2002
...
F2100
M3001
M3002
...
M3100
M4001
M4002
...
M4100

所有扩展名为 .wav。

我还有一个包含 3 位数字的文本文件,例如

  1. 001
  2. 003
  3. 098
  4. 034 ....(共 200 个)。

我想从文件夹 ABC 中选择名称以这 3 个数字结尾的波形文件。

期待 MATLAB 或 bash 脚本解决方案。

我读到这个: Copy or move files to another directory based on partial names in a text file。但我不知道如何为我使用它。

【问题讨论】:

    标签: linux bash matlab


    【解决方案1】:

    用于 Matlab

    1) 使用函数dirrdir 获取文件夹中的所有文件名。

    2) 使用 for 循环遍历每个文件名并将每个文件名的最后 3 位数字添加到数组(数组 A)中。你需要str2num()这里

    3) 将所有 3 位数字解析为一个数组(数组 B)

    4) 使用函数ismember(B, A)查找B的哪些元素包含在A中

    5) 加载对应的文件名

    【讨论】:

    • 我最后尝试了 matlab,使用这个方向。谢谢你。解决了问题。
    【解决方案2】:
    find . -name "*.wav" | grep -f <(awk '{print $0 ".wav"}' file)
    

    grep -f 将使用存储在文件中的模式,每行一个,并在您的查找结果中查找它们。但是您希望三个数字位于末尾,因此在上述命令中,最后一个 awk 语句将提供一个修改后的文件,并在每一行附加“.wav”。所以对于 001 行,“0001.wav”会匹配,但任何文件 0010.wav 都不会。

    请参阅:process substitution syntaxgrep --help

    【讨论】:

    • 感谢您的回复。
    【解决方案3】:
    function wavelist()
    
       wavefiles=dir('*.wav');   % loaded wave files
       myfolder='/home/adspr/Desktop/exps_sree/waves/selectedfiles'; %Output folder to store files
    
       for i=1: numel(wavefiles)  %for each wave file
          filename=wavefiles(i).name;  
          [~,name,~] = fileparts(filename);  % found the name of file without extension
          a=name(end-2:end); %get the last 3 digits in the file name
          fileID = fopen('nameslist','r');
    
          while ~feof(fileID)
              b=fgetl(fileID); % get each line in the list file
    
              if strcmp(a,b) % compare 
                  movefile(filename,myfolder); % moved to otput folder
    
              end
    
          end
       fclose(fileID); 
    
       end
    end
    

    我认为这不是一个简单的答案,这就是我在这里问的原因。无论如何,我的问题解决了,这就是为什么我将其发布为答案。

    谢谢大家。

    【讨论】: