仅删除 linux 目录中的文件而不是目录

发布于 2024-12-08 19:39:52 字数 1817 浏览 1 评论 0原文

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(10

嘿嘿嘿 2024-12-15 19:39:52
find PATH -maxdepth 1 -type f -delete

但是这不会提示您确认或输出刚刚删除的内容。因此,最好首先在不执行 -delete 操作的情况下运行它,并检查它们是否是正确的文件。

find PATH -maxdepth 1 -type f -delete

BUT this won't prompt you for confirmation or output what it just deleted. Therefore best to run it without the -delete action first and check that they're the correct files.

梦醒灬来后我 2024-12-15 19:39:52

您可以将 find-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 {} \;

这应该满足以下标准:

不是目录
不是子目录
这些子目录中没有文件。

You can use find with -type f for files only and -maxdepth 1 so find won't search for files in sub-directories of /path/to/directory. rm -i will prompt you on each delete so you can confirm or deny the delete. If you dont care about being asked for confirmation of each delete, change it to rm -fv (-f for force the delete). The -v flag makes it so that with each delete, a message is printed saying what file was just deleted.

find /path/to/directory -maxdepth 1 -type f -exec rm -iv {} \;

This should meet the criteria:

NOT directories
NOT subdirectories
NOT files in these subdirectories.

紧拥背影 2024-12-15 19:39:52

由于这在谷歌搜索中很高,所以最简单的答案是:

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 目录并保持目录结构完整的 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 上对此进行了测试。所有的行为都像上面的解释。

Since this is high on google search, the simplest answer is:

rm $directoryPath/*

where $directoryPath is the directory you want to empty. Credits should go to cbm3384 (that for some reason has gotten negative votes for this answer, why?)

If you do not want to confirm:

rm -f $directoryPath/*

If you don't believe try man rm or

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/*

The above creates a directory structure, that has 'helloX.txt' in each folder (X is the directory level). rm 1/2/* deletes hello2.txt and leaves the other structure intact.

Also rm */*/* deletes only hello2.txt. It is the only that matches the pattern.

Just an example of a Makefile that cleans cakephp tmp-directory and leaves the directory structure intact:

clean:
    -rm -f tmp/*
    -rm -f tmp/*/*
    -rm -f tmp/*/*/*
    -rm -f tmp/*/*/*/*

Minus in front of the rm means "do not halt on errors" (unremoved directory returns an error). If you want some level to be saved, just remove that line, e.g. second rm line removes logs.

Let me know if you have a system that does something else (BSD?).

EDIT: I tested this on ubuntu 12.04, osx lion and sourceforge.net shell. All behave like the explanation above.

给我一枪 2024-12-15 19:39:52

rm 默认情况下不会删除目录。因此,在您的示例中,假设您位于父目录并且这些是所有文件,您所需要的只是:

rm *

rm won't delete directories by default. So in your example, assuming you're in the parent directory and those are all the files, all you need is:

rm *
喜爱纠缠 2024-12-15 19:39:52

rm -f dirname/* 将仅删除文件,而不提示输入每个文件。它还将为每个子目录显示“无法删除'subdirname':是一个目录”

rm -f dirname/* will remove only files without prompting for each file. It will also display "Cannnot remove 'subdirname': Is a directory" for each sub directory.

彩扇题诗 2024-12-15 19:39:52

TL;DR:

查找 . -maxdepth 1 -type f -delete

等:

没什么大不了的,但上面的建议对我不起作用,因为...

find . -类型f -max深度1 -删除

find:警告:您在非选项参数 -type 之后指定了 -maxdepth 选项,但选项不是位置性的(-maxdepth 影响在其之前指定的测试以及在其之后指定的测试)。请在其他参数之前指定选项。

TL;DR:

find . -maxdepth 1 -type f -delete

Etc:

Not a big deal but the suggestions above didn't work for me because...

find . -type f -maxdepth 1 -delete

find: warning: you have specified the -maxdepth option after a non-option argument -type, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.

翻了热茶 2024-12-15 19:39:52

rm 目录名/*?如果没有 -f 它不会强制删除,如果没有 -r 它不会递归和删除目录和文件。

rm dirname/*? Without -f it won't force-delete, without -r it won't recurse and delete directories as well as files.

提笔书几行 2024-12-15 19:39:52

为此,我将使用最大深度为 1 的 find,然后使用文件列表执行 rm。

find ./dir -maxdepth 1 -type f -exec rm -rf '{}' \;

编辑:这基本上与詹姆斯发布的内容相同,但我直到之后才看到他的帖子

For this, I would use find with a max depth of 1 and then exec rm with the file list.

find ./dir -maxdepth 1 -type f -exec rm -rf '{}' \;

Edit: this is essentially the same as what James posted but I didn't see his post until after

淡笑忘祈一世凡恋 2024-12-15 19:39:52

以下两个命令将递归删除当前目录中的所有文件符号链接:

find . -type f -delete
find . -type l -delete

作为一个命令,可以执行以下操作: find 。 -type f -delete&&find 。 -类型 l -删除

The following two commands will recursively delete all files and symbolic links in the current directory:

find . -type f -delete
find . -type l -delete

As one command, the following works: find . -type f -delete&&find . -type l -delete

铜锣湾横着走 2024-12-15 19:39:52

对我有用的是 PERL 脚本:

perl -e 'chdir "subdirectory_name" or die; opendir D, "."; while ($n = readdir D) { unlink $n }'

从您想要清理的目录向上运行这一级:将“subdirectory_name”替换为目录名称。

在不占用 CPU 的情况下处理数百万个文件。

What worked for me is a PERL script:

perl -e 'chdir "subdirectory_name" or die; opendir D, "."; while ($n = readdir D) { unlink $n }'

Run this one level up from the directory you wish to clean: replace "subdirectory_name" with the directories name.

Worked on millions of files without killing the CPU.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文