如何仅删除文件,但保留目录结构?


16

我想删除每个文件,但保留文件夹结构。有办法吗?

注意:(我正在使用GNU bash 4.1.5)。


1
您“排除”到底是什么意思?您是否正在使用某种命令?如果是这样,请更新您的问题以包括此内容。
slm


我认为您的意思是删除每个文件。
slm

1
@slm我使用通常用于排除文件的命令进行了更新。
汤姆·布里托

不,您还没有:-)或者,如果您这样做了,请再次将其删除
Mawg说,请恢复Monica

Answers:


17

尝试这个:

find . ! -type d -exec rm '{}' \;

这将删除当前工作目录下的每个文件(不包括目录)。使用此命令时要格外小心。

如果find您的计算机上的版本支持,您也可以使用

find . ! -type d -delete

@slm:我不确定它的可移植性。我已将其添加为辅助选项。我只是意识到我的编辑使我的答案与您的答案几乎相同。对于那个很抱歉; 这不是我的意图。

'{}'是否防止文件中的空格?我看到您一直在使用它,而且我认为在看到您使用它发布解决方案之前我从未见过它使用过。
slm

从GNU查找手册页:“注意,括号用单引号引起来,以防止将其解释为shell脚本标点符号。” 我不确定何时需要。我主要是出于习惯。该find命令永远不会看到引号。它只是将{}标记视为参数。

我在示例中看到了,但是模板显示为“ -exec command {} +”和“ -exec command ;”。我\;过去从未使用过'{}'。
slm

@slm:模板也没有显示分号的转义,这在使用shell执行时通常是必需的find。我认为模板旨在显示find命令需要哪些参数,而不用担心与shell相关的任何事情。

7

您可以使用该命令find来找到每个文件,但要维护目录结构:

$ find /some/dir -type f -exec rm {} +

按照标题为:gnu的 Unix和Linux问题解答:gnu查找并掩盖某些外壳的{}-哪个?,转义{}使用'Bash等现代shell不再需要使用单个刻度()来。


1

递归删除当前目录和子目录中每个常规文件的简单方法:

zsh -c 'rm **/*(.)'

只有zsh具有通配符来按类型匹配文件。然而rm命令不适用于目录,因此在bash中,您可以使用

shopt -s globstar
rm **/*

除此以外,此命令不适用于其他命令rm。通常,您可以使用find

find . -type f -delete

或者如果您find不支持-delete

find . -type f -exec rm {} +

-2

我有类似的要求,即从路径及其子目录中删除文件(按时间过滤),而不删除目录结构。

而且我使用了以下对我有用的格式。

找到/ test123 / home / test_file_hip / data / nfs -mtime +6 -type f -exec rm {} \;

Syntex:查找(文件路径)-mtime(大于或小于天)-type f -exec rm {} \;

-type:为“ d”目录提及文件“ f”的类型-exec:执行命令rm:remove {}:find命令的输出

注意:使用前请先进行测试。如果我错过了任何事情,请随时进行纠正或更新。


1
由于这是OP并未提及的附加要求,并且由于find ... rm已经涵盖了基本结构,因此我不确定这是否可以作为对此问题的新答案做出宝贵的贡献。
杰夫·谢勒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.