如何使用脚本删除文件扩展名列表中存在扩展名的每个文件?该列表必须包含在脚本本身中,因为我需要轻松删除运行另一个程序时生成的一堆文件。
我想仅从当前目录(无子目录)中删除具有某些扩展名的所有文件,如果它们不存在则不返回错误。
我想从终端运行脚本。扩展名将始终相同。我需要删除例如从另一个程序生成的一些 .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 -- {} +
替换。当然,您可能还想运行测试,而不先查看将被删除的文件。-delete
find
-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
。