可以运行什么删除命令来仅删除给定目录中的文件
- 不是目录
- 不是子目录
- 不是这些子目录中的文件。
有些文件没有扩展名,所以rm *.*
不会工作......
此文件夹中有数千个文件。
有什么建议吗?
find PATH -maxdepth 1 -type f -delete
但这不会提示您确认或输出刚刚删除的内容。因此最好先在没有 -delete 操作的情况下运行它,并检查它们是否是正确的文件。
您只能将find
with-type f
用于文件,-maxdepth 1
因此find
不会搜索/path/to/directory
. rm -i
将在每次删除时提示您,以便您确认或拒绝删除。如果您不关心每次删除都被要求确认,请将其更改为(rm -fv
强制删除)。该标志使得每次删除时都会打印一条消息,说明刚刚删除的文件。-f
-v
find /path/to/directory -maxdepth 1 -type f -exec rm -iv {} \;
这应该符合以下标准:
NOT 目录
NOT 子目录
NOT 文件在这些子目录中。
由于这在谷歌搜索中很高,最简单的答案是:
rm $directoryPath/*
其中 $directoryPath 是您要清空的目录。学分应该去 cbm3384 (由于某种原因,这个答案得到了反对票,为什么?)
如果您不想确认:
rm -f $directoryPath/*
如果您不相信尝试man rm
或
mkdir -p 1/2/3; echo 'hello1' > 1/hello1.txt; echo 'hello2' > 1/2/hello2.txt;echo 'hello3' > 1/2/3/hello3.txt
rm 1/2/*
上面创建了一个目录结构,每个文件夹中都有“helloX.txt”(X 是目录级别)。rm 1/2/*
删除hello2.txt
并保持其他结构完好无损。
也rm */*/*
只删除hello2.txt
。它是唯一与模式匹配的。
只是一个清理 cakephp tmp-directory 并保持目录结构完整的 Makefile 示例:
clean:
-rm -f tmp/*
-rm -f tmp/*/*
-rm -f tmp/*/*/*
-rm -f tmp/*/*/*/*
前面的减号rm
表示“不要因错误而停止”(未删除的目录返回错误)。如果您想保存某个级别,只需删除该行,例如第二个 rm 行删除日志。
让我知道您是否有一个可以做其他事情的系统(BSD?)。
编辑:我在 ubuntu 12.04、osx lion 和 sourceforge.net shell 上对此进行了测试。所有的行为都像上面的解释。
rm
默认情况下不会删除目录。因此,在您的示例中,假设您在父目录中并且这些都是文件,您只需要:
rm *
find . -maxdepth 1 -type f -delete
没什么大不了的,但上面的建议对我不起作用,因为......
find . -type f -maxdepth 1 -delete
查找:警告:您在非选项参数 -type 之后指定了 -maxdepth 选项,但选项不是位置性的(-maxdepth 影响在它之前指定的测试以及在它之后指定的测试)。请在其他参数之前指定选项。
rm -f dirname/*
将仅删除文件而不提示每个文件。它还将显示"Cannnot remove 'subdirname': Is a directory"
每个子目录。
rm dirname/*
? 没有-f
它就不会强制删除,没有-r
它就不会递归和删除目录和文件。
为此,我将使用最大深度为 1 的 find ,然后使用文件列表执行 rm 。
find ./dir -maxdepth 1 -type f -exec rm -rf '{}' \;
编辑:这与詹姆斯发布的内容基本相同,但直到之后我才看到他的帖子
对我有用的是 PERL 脚本:
perl -e 'chdir "subdirectory_name" or die; opendir D, "."; while ($n = readdir D) { unlink $n }'
从您要清理的目录向上运行这一层:将“subdirectory_name”替换为目录名称。
在不占用 CPU 的情况下处理数百万个文件。
以下两条命令将递归删除当前目录下的所有文件和符号链接:
find . -type f -delete
find . -type l -delete
作为一个命令,以下工作:find . -type f -delete&&find . -type l -delete