根据扩展名删除文件的脚本

根据扩展名删除文件的脚本

如何使用脚本删除文件扩展名列表中存在扩展名的每个文件?该列表必须包含在脚本本身中,因为我需要轻松删除运行另一个程序时生成的一堆文件。

我想仅从当前目录(无子目录)中删除具有某些扩展名的所有文件,如果它们不存在则不返回错误。

我想从终端运行脚本。扩展名将始终相同。我需要删除例如从另一个程序生成的一些 .log 和 .txt 但我不需要,所以我不需要任何命令行参数,只是$ myscript.

我对 bash 脚本一无所知。我写了一些测试,但我删除了它们,因为它们不起作用。在伪代码中它应该是这样的:

myexts = .log, .txt, .somethingelse
for ext in myexts:
    if exists *.ext
        delete *.ext

我尝试了 ilkkachu 建议的代码,但我得到了

$ ./myscript
find: ‘’: No such file or directory
find: ‘’: No such file or directory
find: ‘’: No such file or directory

我尝试更改列表中的扩展名并使用原始列表中的扩展名创建文件,但总是收到此错误。

答案1

假设您有 Bash 或 ksh:

#!/bin/bash
extensions=(c~ h~ bak)
for e in "${extensions[@]}"; do
    find . -name "*.$e" -delete
done

或者如果您没有后者,则可以-exec rm -- {} +替换。当然,您可能还想运行测试,而不先查看将被删除的文件。-deletefind-delete

上面将删除所有子目录中的文件。如果您只想删除当前目录(而不是子目录)中的文件,那么我们可以rm使用find

#!/bin/bash
extensions=(c~ h~ bak)
shopt -s nullglob
for e in "${extensions[@]}"; do
    rm ./*."$e"
done

或者只是简单地

#!/bin/bash
shopt -s nullglob
rm -- *.c~ *.h~ *.bak

更通用的版本会将目录和扩展名作为脚本的参数:

#!/bin/sh
dir=$1
shift
for e in "$@"; do
    find "$dir" -name "*.$e" -delete
done

你可以用 来运行它rmscript.sh /some/target/dir c~ h~ bak

相关内容