Chcę znaleźć polecenie bash, które pozwoli mi grepować każdy plik w katalogu i zapisać dane wyjściowe tego grepa w oddzielnym pliku. Przypuszczam, że zrobiłbym coś takiego
ls -1 | xargs -I{} "grep ABC '{}' > '{}'.out"
ale, o ile wiem, xargs nie lubi podwójnych cudzysłowów. Jeśli jednak usunę podwójne cudzysłowy, polecenie przekieruje dane wyjściowe całego polecenia do pojedynczego pliku o nazwie „{}” zamiast do serii pojedynczych plików.
Czy ktoś wie, jak to zrobić za pomocą xargs? Właśnie użyłem tego scenariusza grep jako przykładu, aby zilustrować mój problem z xargs, więc wszelkie rozwiązania, które nie używają xargs, nie są dla mnie odpowiednie.
xargs
bez-0
: dotyczy to tylko sytuacji, gdy potokujeszfind
wyjście zxargs
, prawda? kiedy zrobię,xargs -a <input_file>
jak mam tego użyć? Większość poleceń, takich jakgrep
wyjścia zi\n
nie,\0.
Jedynym sposobem, w jaki mogę to obejść, jesttr
ponowne użycie, aby to naprawić. Ale dlaczego ważne jest, aby używać go tylko z-0
?-0
,xargs
weźmie twoje nazwy plików i połamie w nich wszystkie spacje, cudzysłowy i ukośniki odwrotne. Powinieneś po prostu zapomnieć oxargs
narzędziu. Jeśli masz linie, użyj pętli bash, aby je iterować:while read line; do <command> "$REPLY"; done < file-with-lines
lubcommand | while ...
xargs
są GNU),xargs
należy tego unikać, chyba że można go używać z-0
. Dziękuję Ci.xargs
, co nie zawsze wiąże się z analizowaniemls
lub użyciemsh -c
. To w najmniejszym stopniu nie odpowiada na pytanie, ale jest pierwszym wynikiem w Google na to pytanie, tylko zwiększającym zamieszanie.xargs -I{} sh -c 'grep ABC "$1" > "$1.out"' -- {}
? W szczególności zasady osadzania (podwójnych) cudzysłowów i znaku „-” na końcu. DziękujęRozwiązanie bez
xargs
jest następujące:... i to samo można zrobić z
xargs
, jak się okazuje:Edycja : pojedyncze cudzysłowy dodane po uwadze przez lhunatha .
źródło
Zakładam, że twój przykład jest tylko przykładem i możesz potrzebować> do innych rzeczy. GNU Parallel http://www.gnu.org/software/parallel/ może być Twoim ratunkiem. Nie wymaga dodatkowego cytowania, o ile nazwy plików nie zawierają \ n:
Jeśli masz nazwy plików zawierające \ n:
Jako dodatkowy bonus otrzymujesz równoległe prace.
Obejrzyj filmy wprowadzające, aby dowiedzieć się więcej: http://pi.dk/1
Podczas instalacji trwającej 10 sekund spróbujemy wykonać pełną instalację; jeśli to się nie powiedzie, instalacja osobista; jeśli to się nie powiedzie, minimalna instalacja:
Jeśli chcesz przenieść go na serwer, na którym nie ma zainstalowanego GNU Parallel, spróbuj
parallel --embed
.źródło