/ / find -name s viacerými názvami súborov pomocou premennej shell - bash, shell, find

find -name s viacerými názvami súborov pomocou premennej shell - bash, shell, find

mám find príkaz, ktorý nájde súbory s názvom zodpovedajúcim viacerým vzorkám uvedeným proti -name parameter

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

Toto vyhľadáva požadované súbory úspešne na príkazovom riadku. To, čo hľadám, je použiť tento príkaz v shellovom skripte a pripojiť sa k nemu tar príkaz na vytvorenie tar z log súborov. Takže v skripte urobím nasledovné:

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

Toto netiskne súbory, ktoré hľadám.

Najskôr - prečo tento skript nefunguje ako príkaz? Akonáhle sa to stane, môžem to zviesť cpio alebo podobne vytvoriť tar v jednom zábere?

odpovede:

6 pre odpoveď č. 1

Vyzerá ako find sa nezhoduje * v modeloch z nekótovaných premenných. Táto syntax funguje pre mňa (pomocou bash polí):

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

Váš príklad by sa stal nasledovný:

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

1 pre odpoveď č. 2
eval "find -L . ( ${LIST} )"

1 pre odpoveď č. 3

Môžete použiť eval a xargs,

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

1 pre odpoveď č. 4

Keď máte dlhý zoznam názvov súborov, ktoré používate, môžete skúsiť nasledovnú syntax:

# 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}") )

Táto metóda konštruuje argument postupne pomocou prvkov zo zoznamu, ktorý má tendenciu lepšie fungovať (aspoň v mojich nedávnych skúsenostiach).

Môžete použiť nájsť "s -exec možnosť preniesť výsledky do archivačného programu:

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

0 pre odpoveď č. 5
LIST="-name SystemOut*.log -o -name *.out -o -name *.log -o -name javacore*.*"

Zástupné znaky sú už citované a nie je potrebné ich znovu citovať

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

vnútorné citácie sú zachované a find dostane ich ako súčasť argumentu.