使用[msys] bash删除名称与模式匹配的所有文件,而不管文件名字母大小写

时间:2015-02-26 03:53:58

标签: c++ linux bash shell

我需要一种清理目录的方法,该目录由C / C ++构建的文件(.o,.a,。EXE,.OBJ,.LIB等)填充,由(1)一些工具生成始终创建具有UPPER-CASE名称的文件,以及(2)始终创建小写文件名的其他工具。 (我无法控制这些工具。)

我需要从MinGW'msys'bash.exe shell脚本(或bash命令提示符)执行此操作。我理解管道(|),但尚未提出正确的exec组合。我已经使用如下示例的命令成功过滤了文件名:

ls | grep '.\.[eE][xX][eE]'

列出文件扩展名中包含任何字母组合的所有文件 - 此示例获取所有可执行文件(例如“.EXE”)文件。

(我将对.o,.a,.OBJ,.LIB,.lib,.MAP等进行类似处理,它们与C / C ++源文件共享同一目录。我不这样做想要删除源文件,只删除内置文件。是的,我可能应该重新编写目录结构,为内置文件[仅]使用单独的目录,但这需要时间,我需要一个快速的解决方案现在。)

如何将上面的命令与“其他”东西合并(例如,像'rm -f'命令???),进一步执行此操作,实际删除[仅]那些滤出的文件从目前的目录? (我希望找到一个不需要临时文件来保存过滤文件名的解决方案。)

3 个答案:

答案 0 :(得分:0)

这是你的意思吗?

rm -f `ls | grep '.\.[eE][xX][eE]'`

但通常是你的" ls | grep ..."输出将有一些你必须删除的其他字段,如日期等,所以你可能只想输出文件名本身。

尝试类似:

rm -f `ls | grep '.\.[eE][xX][eE]' | awk '{print $9}'`

您的文件名在第9个字段中,如:

-rwxr-xr-x  1 Administrators None       283 Jul  2  2014 search.exe

答案 1 :(得分:0)

您可以使用以下命令:

ls | grep '.\.[eE][xX][eE]' | xargs rm -f

使用" xargs"将标准输入(在这种情况下是前一个命令的输出)作为" rm -f"的参数。命令。

答案 2 :(得分:0)

添加此答案,因为接受的答案是建议在实际脚本中不推荐的做法。 (请不要感觉不好,我也曾经在那条赛道上......)

解析ls输出是NO-NO!有关原因的详细说明,请参阅http://mywiki.wooledge.org/ParsingLs

简而言之,ls将文件名与换行符分开;它可以出现在文件名本身中。 (另外,ls没有正确处理其他特殊字符。ls human 可读形式打印输出。)在unix / linux中,有一个换行符完全有效文件名。

虽然unix文件名不能包含NULL字符。因此,下面的命令应该有效。

find /path/to/some/directory -iname '*.exe' -print0 | xargs -0 rm -f
  1. find:用于查找符合所需模式/标准的文件的工具。
  2. -iname:使用特定名称进行搜索,不区分大小写。请注意,-iname的参数是通配符,而不是正则表达式。
  3. -print0:打印以NULL字符分隔的文件名。

  4. xargs:从标准输入和输入中获取输入在它们上运行提供的命令(在这种情况下为rm -f)。默认情况下,输入由空格分隔。

  5. -0指定输入由空字符分隔。
  6. 甚至更好的方法,

    find /path/to/some/directory -iname '*.exe' -delete
    

    -delete是find的内置功能,可删除随模式找到的文件。

    请注意,如果您想进行其他操作,例如将其移至特定目录,则需要使用xargs的第一个选项。

    最后,此命令find /path/to/some/directory -iname '*.exe' -delete将以递归方式查找*.exe个文件/目录。您可以使用-maxdepth 1&amp ;;将搜索范围限制为当前目录。使用-type f将文件类型转换为简单文件(不是目录,管道等)。查看我提供的手册链接以获取更多详细信息。