bash:反向(即非)shell 通配符扩展?

发布于 2024-12-06 03:35:25 字数 287 浏览 0 评论 0原文

有没有办法处理反 bash v4 shell 扩展,即。不将所有文件视为通配符?在这种情况下,我需要 rm 所有不属于 'Folder-???' 格式的文件,并且想知道是否有更短的(即内置) 方式然后进行

for file in *
do
  [[ $i =~ \Folder-...\ ]] && rm '$i'
done

循环。 (顺便说一句,这个例子不起作用……)

只是出于学习 bash 的好奇心……

Is there a way of handling invers bash v4 shell expansion, ie. treat all files NOT like a wildcard? I need to rm all files that are not of the format 'Folder-???' in this case and was wondering if there is a shorter (ie. built-in) way then doing a

for file in *
do
  [[ $i =~ \Folder-...\ ]] && rm '$i'
done

loop. (the example doesn't work, btw...)

Just out of bash learning curiosity...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

不交电费瞎发啥光 2024-12-13 03:35:25
shopt -s extglob
rm -- !(Folder-???)
shopt -s extglob
rm -- !(Folder-???)
怎会甘心 2024-12-13 03:35:25

@Dimitre 有 bash 的正确答案。一个可移植的解决方案是使用 case

for file in *; do
  case "$file" in
    Folder-???) : ;;
    *) do stuff here ;;
  esac
done

另一个 bash 解决方案是在 [[ ... ]] 中使用模式匹配运算符 (文档

for file in *; do
  if [[ "$file" != Folder-??? ]]; then
    do stuff here
  fi
done

@Dimitre has the right answer for bash. A portable solution is to use case:

for file in *; do
  case "$file" in
    Folder-???) : ;;
    *) do stuff here ;;
  esac
done

Another bash solution is to use the pattern matching operator inside [[ ... ]] (documentation)

for file in *; do
  if [[ "$file" != Folder-??? ]]; then
    do stuff here
  fi
done
相守太难 2024-12-13 03:35:25

如果您可以使用 find,则可以使用 -not 反转 find 的谓词。

find -not -name 'Folder-???' -delete

(请注意,除了与 shell glob 匹配的其他差异之外,这也是递归匹配,但我假设您足够了解 find

In case you are ok with find, you can invert find's predicates with -not.

As in

find -not -name 'Folder-???' -delete

(note this matches recursively among other differences to shell glob matching, but I assume you know find well enough)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文