Чтобы ответить на вопрос и пока игнорировать проблемы с разбором вывода ls
, чтобы получить вывод (stdout )команды в awk
, вы делаете:
cmd="that command"
output=""
while ((cmd | getline line) > 0)
output = output line RS
status = close(cmd)
Способ кодирования состояния выхода в переменной состояния варьируется от одной awk
реализации к другой. Все, на что вы можете положиться, это то, что он будет равен 0 тогда и только тогда, когда cmd
завершится успешно.
getline
запускает оболочку (, обычно оболочку POSIX, но в некоторых системах это может быть оболочка Bourne )для анализа этой командной строки. Поэтому важно правильно цитировать данные. Лучше всего использовать одинарные кавычки, что является самым безопасным.
Здесь, поскольку вывод в любом случае будет одной строкой (ваш подход не может обрабатывать имена файлов с любыми пробелами, не говоря уже о новой строке ), вам нужно сделать только однуgetline
:
awk -v q="'" '
function shquote(s) {
gsub(q, q "\\" q q, s)
return q s q
}
{
cmd = "du -sk " shquote("/usr/" $9)
cmd | getline du_output
status = close(cmd)
}'
Если вы вызываете getline
без имени переменной, она устанавливает $0
, что может упростить извлечение использования диска:
DIR=/usr export DIR
LC_ALL=C ls -l -- "$DIR" | awk -v q="'" '
function shquote(s) {
gsub(q, q "\\" q q, s)
return q s q
}
{
date = $6 " " $7 " " $8
name = $9
cmd = "du -sk " shquote(ENVIRON["DIR"] (ENVIRON["DIR"] ~ /^\/*$/ ? "" : "/") name)
cmd | getline
disk_usage = $1
print date "\t" name "\t" disk_usage
}'
Это старое решение, а это значит, что его помнят только старики вроде меня.
Найдите индекс файла с помощью ls -i
. Допустим, это 1611645009. Затем в указанном вами каталоге выполните командуfind $NAME_OF_DIRECTORY -inum 1611645009 -exec /bin/rm {} \;
Если это не поможет, то я тоже озадачен.