rm -rf /some/path/*删除该目录(和子目录)中的所有非隐藏文件。

rm -rf /some/path/.*删除该目录中的所有隐藏文件(但不包括子目录),并给出以下错误/警告:

rm: cannot remove directory: `/some/dir/.'
rm: cannot remove directory: `/some/dir/..'


递归删除目标目录中所有隐藏和非隐藏文件和文件夹的正确方法是什么,而又不会收到有关...的警告/错误? />

#1 楼

您总是可以将错误消息发送到/dev/null

rm -rf /some/path/.* 2> /dev/null


也可以

rm -rf /some/path/
mkdir /some/path/


...然后您不必首先去处理隐藏文件。

评论


但是,如果我只想删除隐藏的文件怎么办?

– CMCDragonkai
2014年6月1日13:52

@CMCDragonkai应该是一个不同的问题,但是您可以在Gilles的答案中找到解决方案(rm ..?* * [[..] *应该这样做)。

– evilsoup
2014年6月1日18:14

如果不删除并重新创建目录,则存在文件权限之后使用权限不正确的风险(在服务器环境中尤其重要)。谁能自动创建具有与以前相同权限的文件夹?

– Yoo Ludke
2015年9月23日上午8:46

@YoLudke你是绝对正确的,在很多情况下都没有关系,但是删除文件夹并重新创建在语义上并不等同于清空该文件夹。所以要小心!

–托马斯
2015年12月29日下午5:43

并非总是可以删除目录。在我的情况下,该目录是docker卷,尽管我可以在该卷内执行任何操作,但是我无法从容器内更改该卷本身。

– dovidweisz
19年6月3日在15:15

#2 楼

*匹配所有非点文件,.[!.]*匹配除.之外的所有点文件和名称以..开头的文件,而..?*匹配除..之外的所有点文件。它们一起匹配...以外的所有文件。如果这三种模式中的任何一种都不匹配,它就会扩展为自身。 rm -f不在乎不存在的参数,因此无关紧要。

rm -rf ..?* .[!.]* *


还可以使用find。这比较复杂,但是即使有太多文件,上面的通配符将扩展到系统的命令行长度限制之外,它也可以工作。

找到更清晰的方法来删除并重新创建目录。这样的好处(或缺点,视情况而定)会导致目录为空,即使另一个程序正在原始目录中同时创建文件。

评论


这应该是可接受的答案,因为它可以防止父级遍历和可能的删除。

–rbellamy
15年6月12日在17:06

即使未成功删除某些文件,“查找”替代也将返回“成功”。不利于脚本。

–于富兰
16年7月29日在7:22

关于第二个find命令,查找状态的联机帮助页“由于-delete意味着-depth,因此不能有效地同时使用-prune和-delete”。 -但是您使用-prune -delete吗?

– Doktor J
16年8月18日在21:29

@DoktorJ确实,-prune在这里不做任何事情。在回读时,我发现我没有正确回答问题:我注意不要递归,但是这个问题明确要求递归删除。我已经纠正了我的答案。

–吉尔斯'所以-不再是邪恶的'
16年8月18日在21:53

@haylem在zsh中,启用历史记录替换时(默认情况下是交互式的情况,但在脚本中不是这种情况),您需要编写。[^。] *而不是。[!。] *,因为zsh会解析!作为历史参考。但是在zsh中,您一开始并不需要,只需使用*(D)在通配符匹配中包含点文件(不带。或..)。

–吉尔斯'所以-不再是邪恶的'
17年8月1日14:29



#3 楼

刚刚意识到这是大多数Linux发行版中最方便的方法:

>
-A =将所有项目放在一行中

评论


我看到的缺点是:您需要“ cd”进入目录才能执行此操作。

– Kumar
16年11月24日在9:38

ls -A1 /您的路径/ | xargs rm -rf应该适用

– godzillante
16-11-24在14:02



nope..it无济于事-例如:ls -A1〜/ test / | xargs rm -rf此命令删除我当前“ cd进入”的文件..不在目录〜/ test中。

– Kumar
16-11-25在6:44



如果任何文件名包含空格,换行符,引号或反斜杠,则将无法使用。

–StéphaneChazelas
17年6月13日在12:14

-1由于上面的评论。 ↑↑↑↑↑↑↑↑

–某事
19年7月12日在20:54

#4 楼

更改外壳程序的dotglob选项并使用*,或使用类似find的名称。

find somedir -mindepth 1 -delete


评论


或者,您可以简单地rm -rf / some / dir,然后在其位置创建一个新的空目录。

–tripleee
13年5月26日在12:11

到目前为止最好的选择。由于您明确指定目录路径,因此非常安全。

–雅尼克·吉鲁亚德(Yanick Girouard)
19年7月11日在20:01

#5 楼

这应该像@Gilles答案一样工作,但要更紧凑:为安全起见在脚本中使用的if

rm -rf {,.[!.],..?}*


评论


奇怪的是,作为Ubuntu 16.04 LTS上的bash别名,先前的答案无效。但是,别名cleandir ='rm -rf {,。[!。],.. ??} *'可以。

–史蒂文·文蒂米利亚(Steven Ventimiglia)
18年4月14日在18:44

@StevenVentimiglia与互动!和历史?什么壳?

–user2864740
20 Mar 8 '20 at 19:52



#6 楼

查找是您的朋友。例如find。如果只想下降find /path ! -name '.' ! -name '..' -delete的目录数,请在n参数之后使用-maxdepth n选项。

以上命令已在Ubuntu 13.04系统上进行了测试。可能会在其他现代linux系统上工作。

评论


删除当前目录中的所有目录。 ! -名称 '。' ! -name'..'-type d -delete

–安迪
16年7月3日在4:01

#7 楼


递归删除目标目录中所有隐藏和未隐藏的文件和文件夹的正确方法是什么,而不会收到有关的警告/错误。和..?


假设相关目录为./dir,则

rm -rf ./dir


将删除./dir中的所有文件,包括递归地隐藏文件和目录,并包括./dir目录本身。 >
find ./dir -mindepth 1 -delete


,或者如果find不支持-delete

find ./dir -mindepth 1 -depth -exec rm -rf {} ';'


使用-mindepth 1可以保留顶级目录./dir。 br />

评论


这应该被标记为最佳答案

– kitingChris
19年7月30日在12:39

#8 楼

我建议您尝试

打开点(隐藏文件)



设置dotglob

shopt -s dotglob


关闭点



未设置dotglob

shopt -u dotglob


此方法完全可以按我希望使用的复制命令缺少隐藏目录的方式来工作。 ..

    shopt -s    dotglob
    cp    -rvn  ./$from/*  ./$too/
    shopt -u    dotglob


...也可以使用!

在我看来,您亲爱的读者看不到message_splitter目录。无论如何,它都有一个.svn文件夹需要删除,然后复制到man页面中。

dotglob如果设置,bash包含文件名以“。”开头在路径名扩展的结果中。


引用:



递归cp所有目录,文件和隐藏文件(linuxquestions.org ,访问时间:2018年5月9日)


#9 楼

如果您不介意错误

# rm -rf will force remove a file $(ls -la) lists all files and allows rm to iterate over the results.
rm -rf $(ls -la)


或,2> / dev / null抑制抛出有关删除的错误。 ..

rm -rf $(ls -la) 2> /dev/null


评论


感谢您对这个问题的回答。通过包括所用命令的各个方面的功能,您可以改善此建议以及将来提供的其他答案的帮助。

–user1794469
20年1月3日,18:54

您将意识到ls -la输出了很多不是文件名的内容。尝试删除drwxr-xr-x可能会失败,并且rm将像-rw-r--r--这样的字符串作为一组选项。此外,这将无法删除名称中包含空格,制表符或换行符的任何内容。

– Kusalananda♦
20年1月3日,21:42



#10 楼

为什么没人提:

rm -rf * .*


评论


因为这给出了问题用户想要避免的相同警告。

– Kusalananda♦
20-4-10上午8:37

天哪但这是完成任务的最短一行。

–陈谦
20-4-10上午18:32

#11 楼

尝试以下代码:

Dirlist=``find /some/path/ -type d -name '.[^.]*'`
for HiddenDir in $Dirlist
do
    rm -rf $HiddenDir
done