2

我想编写一个 Posix shell 脚本函数,该函数将匹配需要扩展的空格和全局字符(*?)的模式。在 Python 中,glob.glob('/tmp/hello world*')将返回正确的列表。我如何在外壳中执行此操作?

#!/bin/sh

## this function will list
## all of the files in the /tmp
## directory that match pattern
f() {
  PATTERN="$1"
  ls -1 "/tmp/$PATTERN"
}

touch '/tmp/hello world {1,2,3}.txt'
f 'hello world*'
4

2 回答 2

5

您可以将除*引号之外的所有内容括起来:

ls -l "hello world"*
ls -l "hello world"*".txt"

然后,您可以将带引号的字符串传递给f(). 使用里面的字符串f()需要eval.

#!/bin/sh

## this function will list
## all of the files in the /tmp
## directory that match pattern
f() {
  PATTERN=$1
  eval ls -1 "/tmp/$PATTERN"
}

touch '/tmp/hello world {1,2,3}.txt'
f '"hello world"*'
于 2013-03-27T22:07:10.820 回答
1

find的模式匹配与 shell 的不完全相同,但非常接近,因此您可以利用这一点:

f() {
    find . -mindepth 1 -maxdepth 1 -name "$1" | sed 's#^.*/##'
}

(该sed命令用于从文件名中删除路径前缀。)

于 2013-03-28T01:37:29.717 回答