Zazwyczaj najlepiej jest bezpośrednio, -exec ${tgt_process} \{\} +
ale jeśli z jakiegoś powodu potrzebujesz uzyskać listę nazw plików w pliku lub strumieniu find
, której potrzebujesz, możesz:
find -exec sh -c 'printf "///%s///\n" "$@"' -- \{\} +
Z tego możesz wyciągnąć dwa unikalne ciągi. Na początku każdej nazwy pliku znajduje się ciąg, \n///
a na końcu każdej nazwy pliku jest ciąg ///\n
. Te dwa ciągi nie występują nigdzie indziej na find
wyjściu, z wyjątkiem tych pozycji, niezależnie od znaków zawartych w nazwach plików.
Ponadto powyższe użycie jest bazowe, przenośne POSIX i można na nim polegać, działając na prawie każdym systemie uniksowym. Nie dotyczy to stosowania ogranicznika zerowego bajtu - pomimo jego wygody - zalecanego przez niektóre inne.
Ale znowu jest to konieczne tylko wtedy, gdy nie możesz bezpośrednio skierować -exec
swojego $tgt_process
z jakiegokolwiek powodu, ponieważ taki powinien być twój cel. Po pierwsze, powyższa metoda nadal wymaga analizy. Na przykład, jeśli chcesz cytować każdą nazwę powłoki, najpierw musisz upewnić się, że wszystkie twarde cudzysłowy w nazwie pliku zostały pominięte:
find ... + | sed 's|'\''|&"&"&|g;s|///|'\''|g'
To powoduje, że tablica nazw plików jest poprawnie uciekana przez powłokę, niezależnie od tego, jakie mogą być ich znaki składowe. Teraz musisz tylko mieć nadzieję, że twoja aplikacja po stronie odbierającej go nie zmieni.