在命令行中删除特定文件

tea*_*eef 8 command-line

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

cio*_*y23 17

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

rm fileName_{100..100000}
Run Code Online (Sandbox Code Playgroud)

  • 信息:这是有效的,因为 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`。 (3认同)

Avi*_*Raj 6

你也可以试试这个命令,

for i in $(seq 100 100000); do rm fileName_$i; done
Run Code Online (Sandbox Code Playgroud)

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


小智 5

一般来说,您有几种方法可以实现这一目标:

rm fileName_{100..100000}
Run Code Online (Sandbox Code Playgroud)

将被 shell 扩展为大约 100,000 个文件名。如果 basename 是一条长路径并且数量足够大,则您实际上可能会超过使用此方法的命令行的最大长度。

for

for i in $(seq 100 100000); do rm fileName_$i; done
Run Code Online (Sandbox Code Playgroud)

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

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

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

find . -name 'fileName_[100-100000]' -exec rm {} \;
Run Code Online (Sandbox Code Playgroud)

仍将启动该rm程序约 100,000 次,同时替换最终的\;by+将尝试最小化子进程的数量。这两种方法都可能(或多或少)比使用-delete根本不使用外部命令而是调用系统调用的方法慢。

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

stefan@tuxedo ~ % mkdir askubuntu
stefan@tuxedo ~ % touch askubuntu/filename_{1..1000}
stefan@tuxedo ~ % find askubuntu -name 'filename_[100-1000]' 
askubuntu/filename_1
Run Code Online (Sandbox Code Playgroud)

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