【问题标题】:Bash script: variable output to rm with single quotesBash 脚本:带单引号的变量输出到 rm
【发布时间】:2015-05-14 03:18:10
【问题描述】:

我正在尝试在 bash 脚本中将参数传递给 rm 以自动清理我的系统。例如,我想删除除 *.doc 文件之外的所有内容。所以我写了以下代码。

#!/bin/bash
remove_Target="!*.txt"
rm $remove_Target

但是,输出总是说

rm: cannot remove ‘!*.txt’: No such file or directory

很明显,bash脚本在将变量传递给rm时为我添加了单引号。如何删除单引号?

【问题讨论】:

  • 之前问过这个问题:[在Linux shell中,如何删除一个目录下除了一两个之外的所有文件][1] [1]:stackoverflow.com/questions/21779328/…
  • 引号只是错误消息的一部分。问题是该模式与任何文件都不匹配,因此它按字面意思传递给rm
  • 谢谢@chepner。你说的对。单引号是来自 rm 的错误消息的一部分。我将脚本更改为 rm !(*.txt)。它现在在命令行中工作,但在 bash 脚本中失败。
  • 感谢@AmirH 的建议

标签: bash


【解决方案1】:

使用 Bash

假设我们有一个包含三个文件的目录

$ ls
a.py  b.py  c.doc

删除除*.doc以外的所有内容:

$ shopt -s extglob
$ rm !(*.doc)
$ ls
c.doc

!(*.doc) 是一个扩展的 shell glob 或 extglob,它匹配除以 .doc 结尾的所有文件之外的所有文件。

extglob 功能需要一个现代的bash

使用查找

或者:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-22
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 2018-03-04
    • 2016-01-01
    • 2011-12-26
    相关资源
    最近更新 更多