regex - 在 BASH 中是否有一种方法可以移动匹配 "regexed wildcard"的文件?

标签 regex bash shell

假设我有这个内容:

drwxr-xr-x  2 jirislav jirislav       4096 srp 17 20:31 Forrest Gump
-rw-r--r--  1 jirislav jirislav  491866996 srp 18 19:57 Forrest
-rw-r--r--  1 jirislav jirislav  216513381 srp 18 20:00 Forrest2
-rw-r--r--  1 jirislav jirislav      26131 srp 18 20:01 Forrest-min
-rw-r--r--  1 jirislav jirislav     215131 srp 18 20:01 mess-1
-rw-r--r--  1 jirislav jirislav    6211341 srp 18 20:03 bigger-mess
-rw-r--r--  1 jirislav jirislav   37225110 srp 18 20:05 largest-mess

我想ForrestForrest2Forrest-min 移动到 Forrest Gump 目录无需指定多个输入路径,并且我想在不使用find 命令的情况下执行此操作。

我的意思是 - 有什么方法可以移动(使用 mv cmd)匹配这个正则表达式的所有东西吗?:

mv Forrest[^\ ]* Forrest\ Gump

我知道我不能像这样在 bash 中用 mv 编写这个正则表达式,但是已经为通配符编写了支持,所以我想有可能指定我 在使用星号时不想匹配

来自@anubhava 的解决方案

使用 extglob 你可以:

shopt -s extglob

mv Forrest*([! ]) Forrest\ Gump

extglob 中,模式 *([! ]) 将匹配除空格以外的任何内容。

编辑

请注意,在 Debian 中,jessie 默认打开 extglob,因此您不必记得打开 shell 选项。

最佳答案

不是正则表达式,但它是单一(某种)模式。来自Pattern Matching section of man bash :

$ ls -1
Forrest
Forrest Gump
Forrest-min
Forrest2
$ ls Forrest@(|2|-min)
Forrest     Forrest-min Forrest2

看来您需要启用 extglob shell 选项才能工作:shopt -s extglob(感谢 @Charles Duffy)。看来我的 bash 版本来自 Homebrew在 OS X 上默认启用此功能。

关于regex - 在 BASH 中是否有一种方法可以移动匹配 "regexed wildcard"的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32318148/

相关文章:

linux - 如何在 Linux 中创建运行过程图

regex - 在 Vi - 正则表达式中搜索和替换 "(" ""和 "["

Python:字符串格式化使用 '%' 和 '{' 作为字符的正则表达式字符串

regex - 打印Powershell Regex捕获到输出文件

c++ - 执行 bash shell 命令并提取输出 --> 无效文件错误

linux - 如何删除文本文件中带有模式的单词

linux - Shell 脚本 find cmin 在目录而不是文件上求值

mysql - Distinct,REGEXP应用于MYSQL中的Field和CONCAT_GROUP去除存储过程中的重复单词

linux - 使用 bash shell 解析 CSV 以打印得分最高的行

C 程序 - 我无法在后台运行 shell 脚本