自定义从文件夹中删除文件

问题描述 投票:-1回答:2

我有一个文件夹,可以找到不同的文件。我想检查它是否包含除.gitkeep之外的其他文件并删除它们,同时保留.gitkeep。我怎样才能做到这一点 ? (当谈到bash时,我是新手)

linux bash
2个回答
0
投票

一如既往,有多种方法可以做到这一点,我只是分享我对linux的了解:

1)find <path-to-the-folder> -maxdepth 1 -type f ! -iname '\.gitkeep' -delete

maxdepth为1指定仅搜索当前目录。如果删除maxdepth,它将以递归方式查找路径下所有目录中除“.gitkeep”以外的所有文件。你可以将maxdepth增加到你想要的深度,从你的路径进入目录。

'-type f'指定我们只是在寻找文件。如果您还想查找目录(或链接,其他类型),则可以省略此选项。

-iname'.gitkeep'为'.gitkeep'指定不区分大小写的数学,'\'用于转义'。',因为在bash中,'。'是一个正则表达式。对于区分大小写的匹配,您可以将其保留为-name而不是-iname。

'!'在-iname之前,是进行反向匹配,即查找所有没有名称'.gitkeep'的文件,如果你删除'!',那么你将得到所有匹配'.gitkeep'的文件。

最后,'-delete'将删除符合此规范的文件。

如果要在执行-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'不匹配的文件进行迭代并逐个删除...这不是我想删除文件的最佳方式

3)rm -rf $(ls -a  | grep -v '\.gitkeep')

再次,小心使用rm -rf,而不是上面的rm -rf,你可以再次做一个echo来找出将被删除的文件

我相信有更多方法,但只是一瞥可能性:)

祝好运,

================================================================

编辑:

=>当你试图学习新东西时,联机帮助页是你的朋友,如果你不理解命令是如何工作的,或者它可以采取和做什么选择,总是查找man以获取详细信息。

例如:男人找到

=>我知道你正试图从你的舒适区域学到一些东西,这总是值得称赞的,但是堆栈溢出并不像人们在没有研究的情况下提出问题。

如果你做了研究,你应该在你的问题中提到它,让人们知道你做了什么来自己找到答案。

一个简单的谷歌搜索或深入了解堆栈溢出问题将为您提供类似甚至更好的答案。所以要小心:)

有备则无患 :)


1
投票

你可以使用find:

find /path/to/folder -maxdepth 1 ! -name .gitkeep -delete
© www.soinside.com 2019 - 2024. All rights reserved.