Проблема с пробелами при использовании в команде поиска

Команды fuser и lsof обе перечисляют процессы, у которых открыт файл. В этом контексте открытие файла включает в себя текущий каталог процесса.

С fuser вы получаете только идентификаторы процессов, поэтому вам нужно вызвать ps , чтобы получить имя команды.

pids=$(fuser -s /x/y/z 2>/dev/null | tr ' ' ',')
pids=${pids#,}
node_pids=$(ps -p "$pids" -o pid=,args= | awk '$2 == "node" && $3 == "server.js" {print $1}')
kill $node_pids

С помощью lsof вы можете указать, что вам нужны процессы только с этим текущим каталогом (в отличие, например, от текущего списка содержимого каталога). Вы можете получить имя команды, указав вывод c , но не аргументы.

pids=$(lsof -F p -a -d cwd . | sed '1s/^p//; s/p/,/' | tr -d \\n)

2
19.07.2016, 02:31
2 ответа

В вашей версии find {} в строке заменяется именем файла. Использование {} как часть строки почти всегда является ошибкой, потому что имя файла вставляется именно так. Здесь имя файла используется как фрагмент сценария оболочки. Если есть каталог с именем a '$ (touch wibble)' , тогда ваша команда выполняет код оболочки

pwd; echo 'a'$(touch wibble)''; zip -v 'a'$(touch wibble)'/a'$(touch wibble)'.zip' 'a'$(touch wibble)'/*' -x \*.zip -x \*.id"`

. Обратите внимание, как это выполняет команду touch wibble (четыре раза).

Вместо этого вам нужно передать имя файла в качестве аргумента фрагмента оболочки. Это единственный способ использовать find -exec или find -execdir для надежного вызова оболочки (за исключением случаев, когда имена файлов не должны содержать специальных символов, включая пробелы). К первому аргументу после sh -c SCRIPT можно получить доступ из сценария как «$ 0» .

Кроме того, zip не принимает подстановочные знаки в своем списке файлов для заархивирования, поэтому подстановочный знак необходимо оставить без кавычек, чтобы оболочка расширила его.

find pictures/ -type d -links 2 -execdir sh -c 'pwd; echo "$0"; zip -v "$0/$0.zip" "$0/"* -x \*.zip -x \*.id' {} \;
2
29.04.2021, 00:12

Измените его следующим образом:

find pictures -type d -links 2 -execdir \
    sh -c 'pwd; echo "$1"; zip -vr "$1/$1.zip" "$1" -x \*.zip -x \*.id' sh {} \;
2
29.04.2021, 00:12

Теги

Похожие вопросы