设置后,是一个带有find静态的变量吗?

时间:2014-12-12 01:04:13

标签: linux bash

如果我在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 {} \;)

1 个答案:

答案 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;)。