Команды 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)
В вашей версии 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' {} \;
Измените его следующим образом:
find pictures -type d -links 2 -execdir \
sh -c 'pwd; echo "$1"; zip -vr "$1/$1.zip" "$1" -x \*.zip -x \*.id' sh {} \;