【问题标题】:rm -f won't handle all arguments in bash scriptrm -f 不会处理 bash 脚本中的所有参数
【发布时间】:2015-09-09 10:18:06
【问题描述】:

在 bash 中遇到了一些特殊问题。我想编写一个脚本,该脚本采用文件名的前缀并删除以该前缀开头并以某些给定后缀结尾的所有文件。为此,我有以下代码行:

#!/bin/bash

if [ $# -lt 1 ]; then
        echo "Please provide an argument";
        exit 1
fi

# Ending dot already included in $1
rm -f $1"aux" $1"bbl" $1"blg" $1"synctex.gz" $1"log"

# But even if you call it wrong...
rm -f $1".aux" $1".bbl" $1".blg" $1".synctex.gz" $1 ".log"

exit 0

不幸的是,当我按预期调用我的脚本(称为cleanlatex)时:

cmd$ cleanlatex lpa_aaai.

仅删除 .aux 文件。显然rm -f 没有将其应用扩展到所有参数,如果我明确运行rm -f lpa_aaai.aux lpa_aaai.bbl ... 就会这样做。我在这里做错了什么?

编辑:回答@Etan 的问题,这是我在添加这些命令时看到的:

+ '[' 1 -lt 1 ']'
+ rm -v lpa_aaai.aux lpa_aaai.bbl lpa_aaai.blg lpa_aaai.synctex.gz lpa_aaai.log
removed ‘lpa_aaai.aux’
removed ‘lpa_aaai.bbl’
removed ‘lpa_aaai.blg’
removed ‘lpa_aaai.synctex.gz’
removed ‘lpa_aaai.log’
+ rm -v lpa_aaai..aux lpa_aaai..bbl lpa_aaai..blg lpa_aaai..synctex.gz lpa_aaai. .log
rm: cannot remove ‘lpa_aaai..aux’: No such file or directory
rm: cannot remove ‘lpa_aaai..bbl’: No such file or directory
rm: cannot remove ‘lpa_aaai..blg’: No such file or directory
rm: cannot remove ‘lpa_aaai..synctex.gz’: No such file or directory
rm: cannot remove ‘lpa_aaai.’: No such file or directory
rm: cannot remove ‘.log’: No such file or directory

cannot remove 消息组成的第二组与我无关:无论如何,我只是将这些删除作为故障保护。这正是我需要的。谢谢。

【问题讨论】:

  • 试试这个:rm -f $1{.,}{aux,bbl,blg,log,synctex.gz}.
  • 在我的机器上没有问题,无论有没有.输入都可以正常工作。
  • 如果你从当前目录运行你的脚本,在你的.sh文件之前使用./,或者使用absolute path作为/tmp/foo/myscript.sh
  • 如果将set -x 添加到脚本顶部并将-v 添加到rm 调用,您会看到什么?
  • 看看我的编辑。

标签: bash expansion rm


【解决方案1】:

不清楚你的问题到底是什么;但是,您可以将脚本缩减为两行 bash

: ${1?Please provide an argument}
rm -f "$1".{aux,bbl,log,synctex.gz,log}

使用标准 POSIX 参数扩展,第一行与您的 if 语句具有相同的效果。

第二行正确引用$1 并使用大括号扩展来生成带有所需后缀列表的文件名序列。它做了一个简化的假设,即用户键入了没有尾随句点的文件的基本名称:当foo 就足够了时,谁会键入foo.?您已经假设没有名为(例如)foo.auxfoo..aux 的文件,因此您不妨做出一个减少工作量的假设。

我删除了exit 0,因为rm 成功并且您的脚本无论如何都会以状态0 退出,或者rm 失败,在这种情况下您不应该以0 状态退出,而是rm 退出的任何状态与。

【讨论】:

  • 伟大的蒸馏工作。 :) 不要忘记 {.,} 来处理 OP 的 rm 的。
  • 这也有效,比@Etan 的解决方案更优雅一点。我希望我能接受两个答案,但我不能。因此,为了简单起见,我将接受这一点。谢谢。
  • @ghoti 为了清楚起见,我故意省略了第二个rm
  • 另外,如果不清楚:我允许用户使用 调用脚本而不带尾随 '.' 的唯一原因。是因为在我使用的大多数 shell 版本中,TAB 完成一直到“。”,这确实是它应该做的。我没有让用户按下退格键以使脚本正常工作,而且因为我不想编写过滤 bash 中最后一个字符的代码(根据我的经验,这很混乱),我选择只制作两个不同的 @ 987654336@ 电话。删除5个文件没什么大不了的。
猜你喜欢
  • 2013-04-20
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 2019-01-09
  • 2011-03-12
相关资源
最近更新 更多