Не делайте ошибку, делая это:
sh -c "grep ABC {} > {}.out"
Это будет нарушено при многих условиях, в том числе прикольных имен файлов, и невозможно правильно процитировать. Ваш {}
всегда должен быть одним совершенно отдельным аргументом команды, чтобы избежать ошибок внедрения кода. Что вам нужно сделать, это:
xargs -I{} sh -c 'grep ABC "$1" > "$1.out"' -- {}
Относится к xargs
, а также find
.
Кстати, никогда не используйте xargs без опции -0
(если только для очень редкого и контролируемого одноразового интерактивного использования, когда вы не беспокоитесь об уничтожении ваших данных).
Также не разбирайте ls
. Когда-либо. Вместо этого используйте globbing или find
: http://mywiki.wooledge.org/ParsingLs
Используйте find
для всего, что требует рекурсии, и простой цикл с глобусом для всего остального:
find /foo -exec sh -c 'grep "$1" > "$1.out"' -- {} \;
или нерекурсивный:
for file in *; do grep "$file" > "$file.out"; done
Обратите внимание на правильное использование кавычек.