В зависимости от то, что Вы хотите сделать Вас, может использовать 1,2 или 3
из https://www.kernel.org/doc/Documentation/sysctl/vm.txt
drop_caches
Запись в это заставит ядро отбрасывать чистые кэши, dentries и inodes из памяти, заставляя ту память стать бесплатной.
Освободить pagecache:
echo 1 > /proc/sys/vm/drop_caches
Освободить dentries и inodes:
echo 2 > /proc/sys/vm/drop_caches
Освободить pagecache, dentries и inodes:
echo 3 > /proc/sys/vm/drop_caches
Поскольку это - неразрушающая операция, и грязные объекты не freeable, пользователь должен выполнить 'синхронизацию' сначала.
Из ksh
, bash
или /usr/xpg4/bin/sh
, предполагая, что имена файлов не содержат символов новой строки, вы можете использовать оператор split+glob на выходе grep -l
(-l
to list the files that match).
Этот оператор вызывается, оставляя замену команды (`...`
или $(...)
) не заключенным в кавычки. Здесь мы настраиваем его специальной переменной $IFS
, чтобы сказать, какой символ мы хотим разделить на (здесь символ новой строки), и отключая часть glob
с набором -f
:
IFS='
'
set -f
mv $(set +f; grep -l searchstring filename*) ../mydir/
(мы восстанавливаем глобус внутри подстановки команды (которая выполняется в подоболочке) для расширения имени файла *
).
Можно упростить до:
mv $(grep -l searchstring filename*) ../mydir/
Если вы знаете, что имена файлов не содержат пробелов, табуляции, новой строки, символов *
, ?
или [
. Вышеуказанное разбиение производится на символы newline, пробел и tab (что является значением по умолчанию $IFS
), и глобус выполняется на каждое слово, полученное в результате этого разбиения (но это не проблема, если ни одно из имен файлов не содержит символов подстановки символов).
Если вы не можете гарантировать, что имена файлов не будут содержать символов новой строки, вы можете использовать цикл вместо этого:
for f in filename*; do
grep -q searchstring "$f" && mv "$f" ../mydir/
done