相关疑难解决方法(0)

在unix/linux shell中进行模式匹配时,如何使用反向或负向通配符?

假设我想复制目录的内容,不包括名称中包含"音乐"一词的文件和文件夹.

cp [exclude-matches] *Music* /target_directory
Run Code Online (Sandbox Code Playgroud)

什么应该代替[exclude-matches]来实现这个目标?

bash shell glob pattern-matching

317
推荐指数
8
解决办法
17万
查看次数

为什么我不在bash中启用extglob?

我刚刚在这里找到了关于bash extglob shell选项: - 在unix/linux shell中进行模式匹配时如何使用反向或负向通配符?

所使用的所有答案shopt -s extglob也提到shopt -u extglob将其关闭.我为什么要把这么有用的东西转过来?确实,为什么不默认开启?据推测,它有可能带来一些令人讨厌的惊喜.这些是什么?

bash

47
推荐指数
1
解决办法
1万
查看次数

列出与选择器不匹配的所有文件(使用ls)

可能重复:
在unix/linux shell中进行模式匹配时如何使用反向或负向通配符?

我已经阅读了该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,awkgrep,但我一直在坚持理解如何编写正则表达式.我清楚地理解正则表达式的概念,但我对使用不同语法的正则表达式感到困惑.

任何帮助将非常感激!

编辑:

我忘了提,我正在运行的Mac OS X,这样的功能可以是在其他的答案为UNIX/Linux外壳讨论的略有不同(因此我的一些困惑与sed,awkgrep).

shell terminal command-line ls sed

12
推荐指数
5
解决办法
3万
查看次数

模式在交互式 shell 中有效,但在脚本中无效

在我的交互式 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)

为什么放入脚本时会失败?

bash glob extglob

1
推荐指数
1
解决办法
56
查看次数

标签 统计

bash ×3

glob ×2

shell ×2

command-line ×1

extglob ×1

ls ×1

pattern-matching ×1

sed ×1

terminal ×1