假设我有这个内容:
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
我想将 Forrest、Forrest2 和 Forrest-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/