Невозможно удалить постоянный глупый файл

Чтобы ответить на вопрос и пока игнорировать проблемы с разбором вывода 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
  }'
2
12.10.2019, 01:58
1 ответ

Это старое решение, а это значит, что его помнят только старики вроде меня.

Найдите индекс файла с помощью ls -i. Допустим, это 1611645009. Затем в указанном вами каталоге выполните командуfind $NAME_OF_DIRECTORY -inum 1611645009 -exec /bin/rm {} \;

Если это не поможет, то я тоже озадачен.

6
27.01.2020, 21:53

Теги

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