如果我在bash脚本中使用以下内容,是为脚本的其余部分设置变量,还是每次调用变量时重新运行find命令?
example=$(find /path/to/files -name "test")
这就是我正在做的事情:
# sets new_tv_name variable
new_tv_name=$(find "$TR_TORRENT_DIR/$TR_TORRENT_NAME" -type f -not -size -100M -not -size +2G -not -iname "*sample*" \( -iname "*s[0-9]*" -o -iname "*s[0-9][0-9]*" -o -iname "*s[0-9][0-9][0-9]*" -o -iname "*e[0-9]*" -o -iname "*e[0-9][0-9]*" -o -iname "*e[0-9][0-9][0-9]*" -o -iname "*s[0-9][0-9]e[0-9][0-9]*" -o -iname "*s[0-9][0-9]e[0-9][0-9][0-9]*" -o -iname "*s[0-9][0-9][0-9]e[0-9][0-9][0-9]*" -o -iname "*s[0-9]e[0-9][0-9]*" -o -iname "*s[0-9]e[0-9][0-9][0-9]*" -o -iname "*[0-9]x[0-9]*" -o -iname "*[0-9]x[0-9][0-9]*" -o -iname "*[0-9][0-9]x[0-9][0-9]*" -o -iname "*[0-9][0-9][0-9]x[0-9][0-9][0-9]*" -o -iname "*hdtv*" \) -exec basename {} \;)
# sets new_tv_directory variable
new_tv_directory=$(find "$TR_TORRENT_DIR/$TR_TORRENT_NAME" -type f -not -size -100M -not -size +2G -not -iname "*sample*" \( -iname "*s[0-9]*" -o -iname "*s[0-9][0-9]*" -o -iname "*s[0-9][0-9][0-9]*" -o -iname "*e[0-9]*" -o -iname "*e[0-9][0-9]*" -o -iname "*e[0-9][0-9][0-9]*" -o -iname "*s[0-9][0-9]e[0-9][0-9]*" -o -iname "*s[0-9][0-9]e[0-9][0-9][0-9]*" -o -iname "*s[0-9][0-9][0-9]e[0-9][0-9][0-9]*" -o -iname "*s[0-9]e[0-9][0-9]*" -o -iname "*s[0-9]e[0-9][0-9][0-9]*" -o -iname "*[0-9]x[0-9]*" -o -iname "*[0-9]x[0-9][0-9]*" -o -iname "*[0-9][0-9]x[0-9][0-9]*" -o -iname "*[0-9][0-9][0-9]x[0-9][0-9][0-9]*" -o -iname "*hdtv*" \) -exec dirname {} \;)
答案 0 :(得分:2)
运行foo=$(bar)
的任何情况只会在执行命令时调用bar
一次;此行为对于shell是通用的,而不是以find
特定的任何方式。
在另一个方面 - 以find
方式存储输出是不明确的:您需要强制换行作为分隔符来迭代多个结果,而没有文件名,空格绊倒你,甚至那么,文件名可以在UNIX中合法地包含换行符。
如果您希望代码在所有极端情况下正常工作,最好NUL分隔您的文件并使用数组:
example=( )
while IFS= read -r -d '' filename; do
example+=( "$filename" )
done < <(find /path/to/files -name test -print0)
printf 'Found file: %q\n' "${example[@]}" # print all files found, with unprintable
# characters escaped.
如果您正在记录这些名称只是为了将它们传递给命令,相反,您可以告诉find
自己运行该命令,而不需要将它们存储在shell中。有关详细信息,请参阅UsingFind中的第5节(&#34;操作&#34;)和6(&#34;复杂操作&#34;)。