0

我需要通过终端或 MATLAB 获取文件夹中的所有 .html 文件,但问题是这些 .html 文件在文件中没有明确的 .html 扩展名。在这种情况下,我还尝试捕获也是 .GIF 文件但没有明确扩展名的文件。

我编写了一个脚本,可以在 MATLAB 中执行此操作,该脚本调用 unix 函数基本上循环文件夹中的所有文件,读取它们并获取它们的扩展名,最后将它们从文件夹中删除。

我的代码成功地做到了,但时间太长(可能大约一个小时)。该文件夹中大约有 12'000 个文件,但我正在寻找更省时的文件,尽管它的大小。我确定终端中有两三行的快捷方式。

close all; clear all;

Z=dir('./');
file_number=length(Z)-2;

stats=[];
stats2=[];

for i=1:file_number
    file_name=Z(i+2).name;
    command=['cat ' file_name ' | grep GIF'];
    stats=~unix(command);
    command2=['cat ' file_name ' | grep html'];
    stats2=~unix(command2);

    if stats==1 || stats2==1
        command3=['rm ' file_name];
        unix(command3);
    end

    if rem(i,100)==0
        disp(i);
    end
end

另一个重要细节:我的文件名称中没有 .html 或 .gif。我知道他们有这种类型是因为他们的幻数(并且通过右键单击并查看文件属性)。我的文件名是“1”、“2”、...、“7”、...“11498”。理想情况下,它们是“1.html”、“2.gif”、“3.jpg”等……但事实并非如此。

4

3 回答 3

1

也许您可以将两个 grep 命令合并为一个:

grep -E "GIF|html" file_name

另外,关于 GIF 文件,我认为可以避免复制整个文件,因为实际上需要前三个字节。

于 2013-05-11T21:44:53.470 回答
0

好吧,我得到了魔法棒:

grep -r -l -E "GIF|html" . | xargs rm

奇迹般有效。(电脑只花了3分钟)。

于 2013-05-11T23:16:09.623 回答
0

现在,我无法在 linux 上检查它,但这是我的代码(用于 bash):

% HTML part
command=['for f in ./*; do if grep -q "<html>" "$f"; then  printf "$f\n" >> html_files; fi; done'];
stats=~unix(command);
% GIF part
command2=['for f in ./*; do first_bytes=$(head -c 3 $f); if [ "$first_bytes" == "GIF" ]; then printf "$f\n" >> gif_files; fi; done'];
stats2=~unix(command);

对于 gif 文件,前 3 个字节应为“GIF”。对于 html 文件,它可能必须包含 <html>。这些将创建 2 个文件(gif_files、html_files),分别包含 GIF 和 HTML 文件所需的文件名。您所要做的就是textscan(或textread)这两个文件来获取文件名。我想这种方法会更快,因为控件保留在 bash shell 上,而不是 ping-poning 到 shell 并返回到 MATLAB 20k+ 次!

注意力!确保 gif_files 和 html_files 不存在(或者至少它们是空白的),否则您可能会读取重复数据。

于 2013-05-11T23:11:32.140 回答