我正在尝试制作一个 bash 脚本,该脚本通过指定的目录,查找文件,对其内容进行排序,然后创建一个新文件。 我现在遇到的唯一问题是如何为每个文件指定不同的名称。 代码:
find $1 -name '*.grd' -exec sort -k 2,2 {}> {}.std ;
当您在 find
命令中执行重定向时,shell 在启动 find
之前只执行一次重定向。由于-exec
直接使用 execv()
调用来调用子调用 - 没有 shell,因此将不尊重其参数中的重定向。(诸如>file
之类的重定向由调用 shell 执行,而不是由操作系统作为执行过程的一部分执行)。
对于大多数控制,不要尝试使用 find -exec
,而是直接在 shell 中处理结果:
while IFS= read -r -d '' filename; do
sort -k2,2 <"$filename" >"${filename}.std"
done < <(find "$1" -name '*.grd' -print0)
或者,如果您坚持使用 find -exec
,让它自己启动一个 shell,并在那里进行处理和重定向:
find "$1" -name '*.grd' -exec bash -c
'while (( $# )); do sort -k2,2 <"$1" >"$1.std"; shift; done' _ {} +
其他方法可在 Wooledge wiki 的 UsingFind 页面上找到(请参阅第 5 至 8 节)。