在Bash中,是否有一种简单的方法来获取列,对值运行bash命令,然后将结果作为新列附加?
作为一个简单(并且做作)的例子,假设我想要一个当前目录中的符号链接列表以及它们指向的目标。 awk等价物可能是这样的:
ls | awk '{ "readlink -f "$1 | getline target; print $1, target }'
但那是满口的。我更愿意为此任务明确地使用工具设计。类似xargs
的东西:
ls | add-column readlink -f
输出结果为:
A.txt /path/to/A.txt
B.txt /path/to/B.txt
这样的工具是否存在?
答案 0 :(得分:1)
轻松完成,虽然名称使用下划线而不是短划线更安全(relevant POSIX standard仅保证“支持便携式字符集中的下划线,数字和字母”in function names ):
add_column() {
while IFS= read -r line; do
printf '%s\t%s\n' "$line" "$("$@" "$line")"
done
}
ls -1 | add_column readlink -f --
请注意output of ls
is not suitable for programmatic use,所以这个特殊的例子应该只是一个例子。
答案 1 :(得分:0)
如何使用简单的while
循环:
find -mindepth 1 -maxdepth 1 -type l -print0 |
while IFS= read -r -d '' file; do
printf "%s\t%s\n" "$file" "$(readlink -- "$file")"
done | column -t -s $'\t'
注意我使用的是find
而不是ls
,因为它有-print0
可以使用换行符处理文件名。此外,如果任何符号链接或其任何目标包含选项卡,则不会产生正确的输出格式。