/ / find -name z wieloma nazwami plików przy użyciu zmiennej powłoki - bash, shell, find

find -name z wieloma nazwami plików przy użyciu zmiennej powłoki - bash, shell, find

mam find polecenie, które znajduje pliki o nazwie pasującej do wielu wzorców wymienionych w stosunku do -name parametr

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

To znajdzie wymagane pliki z powodzeniem w wierszu poleceń. Czego szukam, to użycie tego polecenia w skrypcie powłoki i dołączenie do niego za pomocą tar polecenie, aby utworzyć tar wszystkich plików dziennika. Tak więc w skrypcie wykonuję następujące czynności:

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

To nie drukuje plików, których szukam.

Po pierwsze - dlaczego ten skrypt nie działa tak jak polecenie? Kiedy już to zrobi, mogę to połączyć cpio lub podobne do utworzenia tar za jednym razem?

Odpowiedzi:

6 dla odpowiedzi № 1

Wygląda jak find nie pasuje * w wzorach ze zmiennych niecytowanych. Ta składnia działa dla mnie (używając tablic bash):

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

Twój przykład stanie się następujący:

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

1 dla odpowiedzi nr 2
eval "find -L . ( ${LIST} )"

1 dla odpowiedzi nr 3

Możesz użyć eval i xargs,

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

1 dla odpowiedzi nr 4

Jeśli masz długą listę nazw plików, których chcesz użyć, możesz spróbować użyć następującej składni:

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

Ta metoda konstruuje argument sekwencyjnie za pomocą elementów z listy, która zwykle działa lepiej (przynajmniej w moich ostatnich doświadczeniach).

Możesz użyć find "s" -exec możliwość przekazania wyników do programu archiwizującego:

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

0 dla odpowiedzi № 5
LIST="-name SystemOut*.log -o -name *.out -o -name *.log -o -name javacore*.*"

Znaki są już cytowane i nie musisz ich ponownie cytować

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

wewnętrzne cytaty są zachowane i find dostanie je jako część argumentu.