在命令行中删除特定文件


8

我有文件fileName_1fileName_2 ... fileName_100000,其中fileName按顺序编号。如何删除索引大于100的文件?

Answers:


17

如果文件名按顺序编号,请运行以下命令:

rm fileName_{100..100000}

3
信息:这行得通,因为bash(您的shell)会将扩展{x..y}到整个列表。例如,如果您使用echo test{1..3}它,它将被扩展到echo test1 test2 test3然后执行。如您所见,它将打印test1 test2 test3。同样,如果{x..y}没有将参数连接到任何参数,它将仅将数字放在此处。例如,echo test {1..3}将只打印test 1 2 3
卢克(Luc)2014年

1
注意:exec调用对进程可以具有的参数数量施加了限制。您可以使用检索它getconf ARG_MAX。例如,在我的系统上是2097152(〜210万)。这意味着rm(不是内置的)失败将导致文件数量过多。内置命令没有这个问题,其他解决方案也没有。
巴库里

请注意,ARG_MAX是多个字节,而不是多个参数。rm无法立即删除2097152文件。它可以删除2048个文件,每个文件的名称长1023字节(不是1024;参数之间的定界符(在C-land中为\ 0)计入限制)。
godlygeek

6

您也可以尝试使用此命令,

for i in $(seq 100 100000); do rm fileName_$i; done

如果文件名按顺序包含数字,它将删除所有文件(范围从100到100000)。


5

通常,您有几种方法可以实现此目的:

rm fileName_{100..100000}

将由Shell扩展为大约100,000个文件名。如果基本名称是长路径,并且数字足够高,则使用这种方法实际上可能会超过命令行的最大长度。

for

for i in $(seq 100 100000); do rm fileName_$i; done

不会遇到这个问题,但是删除文件的方式相对较慢,因为外壳程序必须执行变量替换并启动rm约100,000次。

如果filename_101缺少某些文件,则上述两种方法都可能导致警告。

通常,基于的解决方案find更好,因为它们仅适用于实际存在的文件(在发现过程中)。但是,有一些细微的差异:

find . -name 'fileName_[100-100000]' -exec rm {} \;

还是会推出rm计划约10万次,而替换最后\;通过+将尽量减少子进程数。这两种方法都可能(比-delete几乎不使用)慢一点,后者根本不使用外部命令,而是调用系统调用。

但是,请始终先检查模式是否与您要定位的文件实际匹配:

stefan@tuxedo ~ % mkdir askubuntu
stefan@tuxedo ~ % touch askubuntu/filename_{1..1000}
stefan@tuxedo ~ % find askubuntu -name 'filename_[100-1000]' 
askubuntu/filename_1

因此,在这种情况下,您将删除要保留的文件,并保留应删除的文件。


4

使用以下命令:

find . -name 'fileName_[100-100000]' -exec rm {} \;

这将删除文件从100到100000。

更多信息:网站


您最好使用+而不是\;-参见这里。或者,甚至更好的是,使用find的-delete命令。
evilsoup,2014年

我对此进行了测试,它仅删除了FileName_1。的[100-100000] 字符类仅与单个字符匹配,所以它只能匹配0或1
deltab
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.