我有一个文件夹,可以找到不同的文件。我想检查它是否包含除.gitkeep之外的其他文件并删除它们,同时保留.gitkeep。我怎样才能做到这一点 ? (对于bash,我是新手)
答案 0 :(得分:1)
您可以使用find:
find /path/to/folder -maxdepth 1 ! -name .gitkeep -delete
答案 1 :(得分:0)
与往常一样,有多种方法可以做到这一点,我只是分享我对linux的了解不多:
1)find <path-to-the-folder> -maxdepth 1 -type f ! -iname '\.gitkeep' -delete
maxdepth为1指定仅搜索当前目录。如果删除maxdepth,它将以递归方式查找除&#39; .gitkeep&#39;以外的所有文件。在您路径下的所有目录中。你可以将maxdepth增加到你想要的深度,从你的路径进入目录。
&#39; -type f&#39;指定我们只是在寻找文件。如果你想查找目录(或链接,其他类型),那么你可以省略这个选项。
-iname&#39; .gitkeep&#39;为&#39; .gitkeep&#39;指定不区分大小写的数学,&#39; \&#39;用于逃避&#39;。&#39;,因为在bash,&#39;。&#39;是一个正则表达式。 对于区分大小写的匹配,您可以将其保留为-name而不是-iname。
&#39;!&#39;在-iname之前,是进行反向匹配,即找到所有没有名称&#39; .gitkeep&#39;的文件,如果你删除了&#39;!&#39;,那么您将获得所有匹配&#39; .gitkeep&#39;的文件。
最后,&#39; -delete&#39;将删除符合此规范的文件。
如果你想在执行-delete之前查看所有文件将被删除,你可以删除该标志,它会显示所有文件:
find <path-to-the-folder> -maxdepth 1 -type f ! -iname '\.gitkeep'
(你最后也可以使用-print,这只是多余的)
2) for i in `ls -a | grep -v '\.gitkeep'` ; do rm -rf $i ; done
并不是真的建议这样做,因为rm -rf总是一个坏主意(IMO)。您可以将其更改为rm -f(以确保它只适用于文件而不是目录)。
为安全起见,建议先对文件列表进行回显,看看是否准备好删除所有显示的文件:
for i in `ls -a | grep -v '\.gitkeep'` ; do echo $i ; done
这将迭代所有不匹配的文件。#gitkeep&#39;并逐个删除它们......这不是我想删除文件的最佳方式
3)rm -rf $(ls -a | grep -v '\.gitkeep')
再次,小心使用rm -rf,而不是上面的rm -rf,你可以再次做一个echo来查找将被删除的文件
我相信还有更多方法,但只是一瞥可能性:)
祝你好运,
灰
=============================================== =================
编辑:
=&GT;当你试图学习一些新的东西时,联机帮助页是你的朋友,如果你不了解一个命令是如何工作的,或者它可以采取和做什么选择,总是查找man以获取详细信息。
ex:man find
=&GT;我知道你正试图从你的舒适区域学到一些东西,这总是值得称道的,但是堆栈溢出并不像人们在没有研究的情况下提问。
如果你做了研究,你应该在你的问题中提到它,让人们知道你做了什么来自己找到答案。
简单的谷歌搜索或深入了解堆栈溢出问题可以为您提供类似甚至更好的答案。所以要小心:)
预先警告是预先设定的:)