
Я использую Oracle Solaris.
Я использую:
grep "searchstring" filename.*
Приведенная выше команда возвращает результат моего поиска.
Теперь я хочу переместить все файлы из результата поиска выше (все файлы, не являющиеся результатом поиска) в определенный каталог ../mydir/
.
Как это сделать одной командой (поиск и перемещение должны выполняться одной строкой команды).
решение1
Из ksh
, bash
или /usr/xpg4/bin/sh
, предполагая, что имена файлов не содержат символов новой строки, вы можете использовать оператор split+glob на выходе grep -l
( -l
длял(это файлы, которые совпадают).
Этот оператор вызывается путем выхода иззамена команды( `...`
или $(...)
) без кавычек. Здесь мы настраиваем его с помощью $IFS
специальной переменной, чтобы указать, по какому символу мы хотим разделить (в данном случае это символ новой строки), и отключая часть glob
с помощью set -f
:
IFS='
'
set -f
mv $(set +f; grep -l searchstring filename*) ../mydir/
(мы восстанавливаем глобализациювнутриподстановки команды (которая выполняется в подоболочке) для расширения filename*
).
Вы можете упростить это до:
mv $(grep -l searchstring filename*) ../mydir/
Если вы знаете, что имена файлов не содержат пробелов, табуляций, новой строки, *
или ?
символов [
. Выше разделение выполняется по символам новой строки, пробелов и табуляции (что является значением по умолчанию $IFS
), а подстановка выполняется для каждого слова, полученного в результате этого разделения (но это не проблема, если ни одно из имен файлов не содержит подстановочных знаков).
Если вы не можете гарантировать, что имена файлов не будут содержать символы новой строки, вы можете использовать цикл:
for f in filename*; do
grep -q searchstring "$f" && mv "$f" ../mydir/
done