用于删除名称不包含某些短语的文件的脚本?

时间:2015-09-10 22:43:42

标签: regex bash grep find rm

如果我有一个文件夹,我可以写什么脚本来删除名字中没有某些短语的文件?

我的文件夹包含

oneApple.zip
twoApples.zip
threeApples.zip
fourApples.zip

我想删除名称中文件名不包含“one”或“three”的文件。

执行脚本后,该文件夹只包含:

oneApple.zip
threeApples.zip

1 个答案:

答案 0 :(得分:4)

使用bash

使用启用了extglob的现代bash,我们可以删除名称不包含onethree的文件:

rm !(*one*|*three*)

要试验extglobs的工作原理,只需使用echo:

$ echo !(*one*|*three*)
fourApples.zip  twoApples.zip

如果上述方法无法正常运行,那么您的bash已过期或extglob已关闭。打开它:

shopt -s extglob

使用find

find . -maxdepth 1 -type f ! -name '*one*' ! -name '*three*' -delete

在运行该命令之前,您可能想要测试它。只需删除-delete,它就会显示找到的文件:

$ find . -maxdepth 1 -type f ! -name '*one*' ! -name '*three*'
./twoApples.zip
./fourApples.zip

工作原理:

  • .

    这告诉find查看当前目录。

  • -maxdepth 1

    这告诉find不要递归到子目录

  • -type f

    这告诉find我们只需要常规文件。

  • ! -name '*one*'

    这会告诉find排除名称中包含one的文件。

  • ! -name '*three*'

    这会告诉find排除名称中包含three的文件。

  • -delete

    这告诉find删除它找到的文件。