bash - shell数据 - shell文件变量




使用shell变量查找具有多个文件名的名称 (4)

我有一个find命令,查找与名称匹配的多个模式与-name参数相关的文件

find -L . \( -name "SystemOut*.log" -o -name "*.out" -o -name "*.log" -o -name "javacore*.*" \)

这会在命令行中成功找到所需的文件。 我正在寻找的是在shell脚本中使用这个命令,并用tar命令加入这个命令来创建所有日志文件的tar。 所以,在脚本中我做了以下几点:

LIST="-name \"SystemOut*.log\" -o -name \"*.out\" -o -name \"*.log\" -o -name \"javacore*.*\" "
find -L . \( ${LIST} \)

这不会打印我正在寻找的文件。

首先 - 为什么这个脚本不能像命令那样工作? 一旦这样做,我可以用cpio或类似的俱乐部它一次创建一个tar


你可以使用eval和xargs,

eval "find -L . \( $LIST \) " | xargs tar cf 1.tar

看起来find未引用变量的模式。 这个语法适用于我(使用bash数组):

LIST=( -name \*.tar.gz )
find . "${LIST[@]}"

你的例子将成为以下内容:

LIST=( -name SystemOut\*.log -o -name \*.out -o -name \*.log -o -name javacore\*.\* )
find -L . \( "${LIST[@]}" \)

LIST="-name SystemOut*.log -o -name *.out -o -name *.log -o -name javacore*.*"

通配符已经被引用,你不需要再引用它们。 而且,在这里

LIST="-name \"SystemOut*.log\""

内部的引号被保留下来, find将会把它们作为参数的一部分。


如果您使用的文件名列表很长,则可以尝试使用以下语法:

# List of file patterns
Pat=( "SystemOut*.log"
"*.out"
"*.log"
"javacore*.*" )

# Loop through each file pattern and build a 'find' string
find $startdir \( -name $(printf -- $'\'%s\'' "${Pat[0]}") $(printf -- $'-o -name \'%s\' ' "${Pat[@]:1}") \)

该方法使用列表中的元素依次构建参数,这往往会更好地工作(至少在我最近的经验)。

您可以使用find的-exec选项将结果传递给存档程序:

find -L . \( .. \) -exec tar -Af archive.tar {} \;






find