有一个文件夹“传输”。在该传输文件夹中有用户文件夹“user1”、“user2”等。我想(定期)删除内容(即用户文件夹中的所有文件和文件夹),但我不想删除“传输”或用户文件夹。
如何使用 shell 脚本/命令来执行此操作,而无需每次添加新用户时手动添加对每个新用户文件夹的调用?
答案1
您可以使用以下find
命令来完成此操作:
find /path/to/transfer -mindepth 2 -delete
-mindepth 2
参数告诉find
忽略前两级目录:搜索目录本身以及直接位于其中的所有文件和文件夹。
-delete
参数只是简单地告诉find
删除所有文件。
-mtime
您可以随时根据需要添加更多参数(例如)。
答案2
失败的答案:
rm -R 传输/用户*/。
例如:
$ rm -R transfer/user*/.
rm: refusing to remove '.' or '..' directory: skipping 'transfer/user1/.'
$
删除所有用户的内容,但留下空的 user* 目录。虽然“点”/“句点”/“当前目录”不会被删除,但它可以用作该位置下递归删除的起点。
更新:不幸的是,我需要撤回有关使用此答案的任何建议。事实上,我在发布之前确实对此进行了测试,但是当听说它不起作用时,我重新测试了它,但它失败了。简单地说,什么都没有被删除。不知怎的,我之前的测试一定是做错了。我确实找到了一种方法来处理这个问题,但认为更新是如此显着不同,以至于该答案的现有评论根本无法与更新很好地匹配,因此我发布了另一个(再次经过测试)解决方案作为不同的答案。
答案3
for x in transfer/user* ; do cd $x ; echo rm -R $( ls -1a | grep -v ^./$ | grep -v ^../$ ) ; cd ../.. ; done
在重新运行不带单词 的命令之前验证这看起来非常好echo
。
我希望在依赖它之前对其进行彻底的测试。我记得有一个例子,类似的事情导致..
匹配要删除的内容(递归地),从而导致大量数据丢失的意外事件。特别是,如果cd $x
失败(可能是由于权限问题),但随后工作正常cd ../..
,然后rm -R
在更高级别的目录上运行,那么您很容易最终从错误的区域递归删除。这就是为什么在它得到充分证明之前我会非常犹豫是否要盲目相信这一点。
这也适用于我测试过的一个系统,该系统在 Debian 上使用 bash。在该系统上,ls -1a
显示.
和..
目录,后面带有斜杠。如果您有不同的ls
命令或行为不同的 shell,那么这可能需要一些调整。
因此,我绝对建议在继续之前考虑是否可以进行手动审核。 (当然,请确保您准备好合适的备份。我记得听说过一种情况,有人有一个删除用户脚本,该脚本被删除/users/$1
,但其他人在没有参数的情况下运行该脚本,希望显示语法。数据来自幸运的是,执行此操作的工作人员对命令花费的时间感到惊讶,因此他寻求帮助,并且备份很容易获得并且能够成功利用。)