如何删除可能存在的文件小写大写案件
例如,file_name 可以是:
- STOCK.Repo 或
- 股票.REPO 或
- Stock.repo 或
- 股票回购协议
- ... ETC
我会跑:
rm -f $file_name
目标是删除远程计算机上可能为小写/大写的 stock.repo 文件
答案1
对于 Bash 特定的解决方案:
$ shopt -s nocaseglob
然后运行rm
命令。
请注意,要取消设置此选项,请使用shopt -u nocaseglob
为了完整起见,我会指出一个替代但不太优雅的解决方案:
$ rm [sS][tT][oO][cC][kK].[rR][eE][pP][oO]
答案2
find
您可以使用命令来完成
find /path/to/directory -type f -iname stock\.repo -exec rm -f {} \;
但要非常小心。它从 /path/to/directory 递归工作。您应该考虑使用 maxdepth 选项,并在可能造成永久性损坏的生产系统上运行该命令之前更熟悉该命令。
答案3
使用zsh
和ksh93
shell,您可以在每个 glob 的基础上进行不区分大小写的匹配:
zsh
:set -o extendedglob # best in ~/.zshrc rm -- (#i)$filename
ksh93
:rm -- ~(i:"$filename")
但请注意,如果没有匹配的文件,
~(i:stock.repo)
则会将文字传递给rm
.如果该文件存在,它将被删除(zsh
上面会因错误而失败,并且rm
在这种情况下根本不会调用)。N
但是,除了标记之外,您还可以设置标记i
:rm -- ~(Ni:"$filename")
然后,在不匹配的情况下,
rm
将被调用,但参数为空(可能是由引号引起的错误,因为它意味着传递不那么根本就没有争论)。然后你会得到一种rm: cannot remove '': No such file or directory
错误,但至少它不会删除错误的文件。
答案4
我已经使用下面的方法完成了。上面提供的答案非常好。下面是我的尝试
ls -ltr | awk '{print $9}' | sed -n '/^STOCK.Repo$/Ip' |awk '{print "rm" " " $1}'| sh