假设我想复制目录的内容,不包括名称中包含"音乐"一词的文件和文件夹.
cp [exclude-matches] *Music* /target_directory
Run Code Online (Sandbox Code Playgroud)
什么应该代替[exclude-matches]来实现这个目标?
我刚刚在这里找到了关于bash extglob shell选项: - 在unix/linux shell中进行模式匹配时如何使用反向或负向通配符?
所使用的所有答案shopt -s extglob也提到shopt -u extglob将其关闭.我为什么要把这么有用的东西转过来?确实,为什么不默认开启?据推测,它有可能带来一些令人讨厌的惊喜.这些是什么?
我已经阅读了该man页面ls,我找不到列出所有与文件选择器不匹配的选项.你知道怎么做这个操作吗?
例如:假设我的目录是这样的:
> ls
a.txt b.mkv c.txt d.mp3 e.flv
Run Code Online (Sandbox Code Playgroud)
现在我想做一些能做到以下事情的事情
> ls -[SOME_OPTION] *.txt
b.mkv d.mp3 e.flv
Run Code Online (Sandbox Code Playgroud)
有这样的选择吗?
如果没有,有没有办法将输出管道输出ls到另一个功能(可能sed),只显示我想要的功能?
我不知道该怎么做,但我想它会是这样的:
> ls | sed [SOMETHING]
Run Code Online (Sandbox Code Playgroud)
我真的应该学习如何使用sed,awk和grep,但我一直在坚持理解如何编写正则表达式.我清楚地理解正则表达式的概念,但我对使用不同语法的正则表达式感到困惑.
任何帮助将非常感激!
编辑:
我忘了提,我正在运行的Mac OS X,这样的功能可以是在其他的答案为UNIX/Linux外壳讨论的略有不同(因此我的一些困惑与sed,awk和grep).
在我的交互式 shell 中,我可以将模式存储在变量中
$ targets="?(pcm52|pcm61)"
$ ls -l config/devdesc.$targets
-rw-r--r-- 1 kfa kfa 113 Dec 16 13:43 config/devdesc.pcm52
-rw-r--r-- 1 kfa kfa 14 Dec 16 13:44 config/devdesc.pcm61
Run Code Online (Sandbox Code Playgroud)
但是如果我创建一个shell脚本
targets="?(pcm52|pcm61)"
ls -l config/devdesc.$targets
Run Code Online (Sandbox Code Playgroud)
运行它时出现此错误
$ bash -x /tmp/e.sh
+ targets='?(pcm52|pcm61)'
+ ls -l 'config/devdesc.?(pcm52|pcm61)'
ls: cannot access 'config/devdesc.?(pcm52|pcm61)': No such file or directory
Run Code Online (Sandbox Code Playgroud)
为什么放入脚本时会失败?