переместить содержимое поиска в другой каталог

переместить содержимое поиска в другой каталог

Я использую 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

Связанный контент