use*_*006 3 command-line bash ls
我有以下文件:
$ ls *.png | egrep -i "am|pm"
output-0 11.42.30 AM.png
output-0 5.10.12 PM.png
....
Run Code Online (Sandbox Code Playgroud)
我想删除它们但收到此错误:
$ ls *.png | egrep -i "am|pm" | while read line; do rm "$line"; done
rm: cannot remove ''$'\033''[0m'$'\033''[01;35moutput-0 11.42.30 AM.png'$'\033''[0m': No such file or directory
rm: cannot remove ''$'\033''[01;35moutput-0 5.10.12 PM.png'$'\033''[0m': No such file or directory
rm: cannot remove ''$'\033''[01;35moutput-1 11.42.30 AM.png'$'\033''[0m': No such file or directory
Run Code Online (Sandbox Code Playgroud)
我的代码有什么问题?
ls在脚本和命令行中存在风险。一个问题是@PerlDuck 的评论中所描述的,ANSI 转义序列颜色输出。我会推荐另一种方法find
创建测试文件
touch 'output-0 11.42.30 AM.png' 'output-0 5.10.12 PM.png' asdf.png
Run Code Online (Sandbox Code Playgroud)检查find命令行是否找到了您希望它找到的文件
find . -type f -iname "*[ap]m*.png"
Run Code Online (Sandbox Code Playgroud)
并做
find . -type f -iname "*[ap]m*.png" -delete
Run Code Online (Sandbox Code Playgroud)
如果您不想搜索子目录,请添加 -maxdepth 1
find . -maxdepth 1 -type f -iname "*[ap]m*.png" -delete
Run Code Online (Sandbox Code Playgroud)检查结果
ls
Run Code Online (Sandbox Code Playgroud)
名称中带有 am, pm, AM, PM 的文件应该被删除但asdf.png不会被删除。
如果您真的想以while read这种方式使用循环,请使用 shell glob 并printf使用空分隔符,例如
printf '%s\0' *.png | grep -zEi 'am|pm' | while IFS= read -r -d '' line; do echo "$line"; done
Run Code Online (Sandbox Code Playgroud)
但是,有几种方法可以bash扩展到要直接删除的文件列表 - 无需管道到grep和while:
使用简单的 shell glob
rm -- *[ap]m.png *[AP]M.png
Run Code Online (Sandbox Code Playgroud)
或者 - 如果您不介意匹配.PNG扩展名 - 使用该nocaseglob选项
shopt -s nocaseglob
rm -- *[ap]m.png
Run Code Online (Sandbox Code Playgroud)使用扩展的 glob
shopt -s extglob
rm -- *@(AM|PM).png *@(am|pm).png
Run Code Online (Sandbox Code Playgroud)或者
shopt -s extglob nocaseglob
rm -- *@(am|pm).png
Run Code Online (Sandbox Code Playgroud)
该--标记选项的结束,以防万一有一些以连字符开头的文件名-你可以使用一种模式有明确的目录前缀一样./*(am|pm),而不是如果你喜欢。
如果要在删除前以交互方式查看文件名,请添加-i或-I选项。
| 归档时间: |
|
| 查看次数: |
320 次 |
| 最近记录: |