我需要一种清理目录的方法,该目录由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'命令???),进一步执行此操作,实际删除[仅]那些滤出的文件从目前的目录? (我希望找到一个不需要临时文件来保存过滤文件名的解决方案。)
答案 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
find
:用于查找符合所需模式/标准的文件的工具。-iname
:使用特定名称进行搜索,不区分大小写。请注意,-iname
的参数是通配符,而不是正则表达式。 -print0
:打印以NULL
字符分隔的文件名。
xargs
:从标准输入和输入中获取输入在它们上运行提供的命令(在这种情况下为rm -f
)。默认情况下,输入由空格分隔。
-0
指定输入由空字符分隔。甚至更好的方法,
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
将文件类型转换为简单文件(不是目录,管道等)。查看我提供的手册链接以获取更多详细信息。