【问题标题】:Bash - to pass to rm a filename which is in a variable, but with ! optionBash - 将文件名传递给 rm 变量中的文件名,但带有 !选项
【发布时间】:2018-11-26 00:06:41
【问题描述】:

命令

rm  !("$filename")

不起作用,因为它在语法上不正确。

我想删除目录中的其他文件,但该文件在 $filename 变量中指定。

其实bash脚本是这样的:

#!/bin/bash

filename="$(ls -t | grep radar_ | head -n 1)"
echo "${filename}"
rm  !("$filename")

我该怎么做?

【问题讨论】:

  • 可能需要开启 extglob。见shopt extglobshopt -s extglob
  • 添加 shopt -s extglob 有帮助。

标签: bash rm


【解决方案1】:

你可以试试这样的:

DIR="/path_to_your_dir"
for file in "${DIR}"/*; do 
  [[ $file = "${filename}" ]] || rm "${file}"
done

或者类似的东西:

DIR="/path_to_your_dir"
ls -1 "${DIR}"|grep -v "${filename}"|xargs -I{} rm {}

或者类似的东西:

 find "${DIR}" ! -name "${filename}" -exec rm {} \;
 find "${DIR}" ! -name "${filename}" -a -type f -exec rm {} \; # apply the rm only on files (not on the directories for example)

我个人会选择find 解决方案来执行此类任务(搜索和对某些文件进行操作)。

【讨论】:

  • find "${DIR}" ! -name "${filename}" -type f -exec rm {} \; 从目录中删除所有内容,而不保留 $filename 变量中指定的文件。我在这里错过了什么?
  • @PalCsanyi 尝试删除-type f 或在两个条件之间添加-a
  • @Idriss Neumann 非常感谢。 -a 解决了我的问题。
  • 甚至不应该考虑使用ls;你应该删除那个例子。
  • @chepner 我不像你那么明确。我的意思是,当然,在脚本中使用ls 通常会导致诸如著名的for i in $(ls ...) 案例之类的错误,当文件名包含空格时,它就无法正常工作。但我使用它的方式并非如此。这个版本的目的是展示我们如何处理grep -vxargs。我说我更喜欢使用find 来完成这类任务;)
【解决方案2】:

shopt -s extglob 提供了帮助。

所以 bash 脚本现在是:

#!/bin/bash

#set -x

shopt -s extglob

filename="$(ls -t | grep radar_ | head -n 1)"
echo "${filename}"
rm  !("$filename")

谢谢赛勒斯!

【讨论】:

  • 但脚本会删除除 $filename 变量中指定的文件之外的任何文件。所以这不是解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 2015-05-21
  • 2016-04-18
  • 1970-01-01
  • 2012-08-14
  • 2021-01-12
相关资源
最近更新 更多