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一次击球吗?

4

6 回答 6

7

看起来find无法匹配*未引用变量的模式。此语法适用于我(使用 bash 数组):

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

您的示例将变为以下内容:

LIST=( -name SystemOut\*.log -o -name \*.out -o -name \*.log -o -name javacore\*.\* )
find -L . \( "${LIST[@]}" \)
于 2012-04-26T21:45:56.827 回答
1
eval "find -L . \( ${LIST} \)"
于 2012-04-26T21:45:48.807 回答
1

当您使用一长串文件名时,您可能需要尝试以下语法:

# 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 {} \;
于 2012-04-26T21:46:52.440 回答
1

你可以使用 eval 和 xargs,

eval "find -L . \( $LIST \) " | xargs tar cf 1.tar
于 2012-04-26T21:49:06.247 回答
0
LIST="-name SystemOut*.log -o -name *.out -o -name *.log -o -name javacore*.*"

通配符已被引用,您无需再次引用它们。此外,这里

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

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

于 2012-04-26T21:53:33.983 回答
0

命令的构建-name列表find

这是执行此操作的正确方法:

cmd=();for p in \*.{log,tmp,bak} .debug-\*;do [ "$cmd" ] && cmd+=(-o);cmd+=(-name "$p");done

或者

cmd=()
for p in \*.{log,tmp,bak,'Spaced FileName'} {.debug,.log}-\* ;do
    [ "$cmd" ] && cmd+=(-o)
    cmd+=(-name "$p")
done

你可以转储你$cmd的数组:

declare -p cmd
declare -a cmd=([0]="-name" [1]="*.log" [2]="-o" [3]="-name" [4]="*.tmp" [5]="-o"
     [6]="-name" [7]="*.bak" [8]="-o" [9]="-name" [10]="*.Spaced FileName" 
     [11]="-o" [12]="-name" [13]=".debug-*" [14]="-o" [15]="-name" [16]=".log-*")

那么现在你可以

find [-L] [/path] \( "${cmd[@]}" \)

作为

find \( "${cmd[@]}" \)

(注:如果没有提交路径,.则默认为当前路径)

find /home/user/SomeDir \( "${cmd[@]}" \)

find -L /path -type f \( "${cmd[@]}" \)
于 2021-08-08T08:19:10.260 回答