我有一个echo
要运行的命令(不是!),它采用绝对路径和相对路径。
我如何得到这两个论点?
试图:
d=/tmp/foo;
find "$d" -type f -exec bash -c 'echo d=${1:${#d}} 1="${1%/*}"' bash {} \;
(我喜欢 GNU find 因为它是递归的,可以按文件限制,可以按文件名过滤,并且不会产生过多的 shell)
期待:
mkdir -p /tmp/foo/bar/can/haz; touch /tmp/foo/bar/can/haz/bzr.txt
# cmd is run, output is:
d=bar/can/haz 1=/tmp/foo/bar/can/haz
Export
d
,那么它将在您的bash
内联脚本中可用。你也根本不需要bash
这里。你的(希望更苗条/更快)sh
也会这样做。此外,您不需要为每个文件运行一个 shell。您可以使用变体将更多文件传递给您的内联脚本-exec cmd {} +
:这使:
但是,如果您只需要相对路径,那么这样做可能会更简单:
这也会使传递给
sh
更短的命令参数,因此允许find
传递更多参数给sh
.请注意,您的
find
命令和我的命令中都没有特定于 GNU 的内容。这应该适用于任何符合 POSIX 的find
实现,而不仅仅是 GNU。您的问题中唯一的非 POSIX 部分显然是 Korn shell 运算符,而不是bash
POSIX 。${1:offset}
sh
对于允许您指定文件类型的递归文件查找,另请参见
zsh
:上面,
.
is 相当于find
's-type f
(仅常规文件),而D
is 也包括隐藏的文件find
。作为旁注,在一般情况下:
不保证输出“是”,因为
${#var}
and${var:offset}
运算符使用字符,而不是字节。例如,在 UTF-8 语言环境中,它不会输出带有这些值的 yes
a
和b
:有了这些,
$c
将包含我的名字 (Stéphane
)$a
包含该é
字符$b
的一半,另一半${#a}
将是3
(2 个字符和 1 个字节不构成有效字符,但仍被计算在内)。$d
会的,phane
不会$'\xa9phane'
的。但在特定情况下
d=$a/$b
,应该没问题,因为系统语言环境中通常可用的字符集都不会包含除/
包含/
.