Как найти файлы, которые не используются ни одним процессом, и удалить их?

С помощью инструментов GNU вы можете:

find. -type f -exec grep --null -El 'mxprod|nlsoprdc' {} + |
  tar --xz -cf /path/to/file.tar.xz --remove-files --null -T -

Хотя для этого конкретного использования findвы можете отказаться от него и использовать -rGNU grep.

grep -r --null -El 'mxprod|nlsoprdc'. |
  tar --xz -cf /path/to/file.tar.xz --remove-files --null -T -

Обратите внимание, что каталоги, в которых находятся найденные файлы, не добавляются в архив. Они будут воссозданы при извлечении архива, но не с исходными метаданными (, владельцами, разрешениями, ACL, другими атрибутами... )исходных.

Вы можете решить эту проблему, выполнив:

grep -r --null -El 'mxprod|nlsoprdc'. |
  awk -F/ -v RS='\0' -v ORS='\0' '{
    p=""; sep=""
    for (i = 1; i < NF; i++) {
      p = p sep $i; sep=FS
      if (! (p in dirs)) {
        print p
        dirs[p]
      }
    }
    print}' |
  tar --xz -cf /path/to/file.tar.xz --no-recursion --remove-files --null -T -

Хотя вы увидите ошибки о каталогах, которые tarнельзя удалить, поскольку они не пусты.

В любом случае обратите внимание, что это опасно, поскольку, например, если файловая система переполнится, xzможет не записать вывод для данного файла после того, как tarуже удалил его.

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

-3
14.12.2019, 03:57
2 ответа

Wine не контролирует удаление файлов, в Unix вы можете удалить запись в каталоге для открытого файла. Файл остается до тех пор, пока он не будет закрыт процессом (es ), использующим его.

Делая то, что вам нужно, выбирая не -в настоящее время -открытые файлы, чтобы вы могли работать с ними по-своему, — это гонка между тем, как вы смотрите, и процессами, открывающими и закрывающими (и, возможно, создающими и удаляющими. )им. Предотвращение этой гонки — прерогатива подсистем ввода заданий мэйнфреймов и языка управления заданиями. Но если «обычно совсем недавно» достаточно близко к текущему для вас, перечислите все файлы, перечислите все открытые файлы, все, что не было указано дважды, существовало, когда вы смотрели, но не было открыто, когда вы смотрели почти в одно и то же время (или был открыт, когда вы смотрели, но не существовал, когда вы смотрели почти в одно и то же время, поэтому я сначала делаю lsof здесь ).

На GNU/ничего,

sort -r <<EOD | uniq -u | while read; do test -f "$REPLY" && echo rm "${REPLY@Q}"; done
$( cd targetdir
   lsof -Fn +D $PWD | sed -n /^n/s/.//p
   find $PWD -printf %p\\n
)
EOD

выдаст список команд для удаления файлов, которые выглядят безопасными для удаления.

Но обычно вы просто стираете свой временный каталог при запуске с некоторой защитой для самых последних файлов,

find $TMPDIR -ctime +6 -delete
Например,

удаляет все, что было сделано как минимум неделю назад.

2
28.01.2020, 05:18

Сzsh:

echo rm -f ~/.wine/drive_c/users/t/Temp/*(D.^e['fuser -s $REPLY'])

(удалить echoкогда счастлив)

При этом удаляются обычные файлы (.)(, в том числе скрытые (D)), для которых fuserне(^)не найден ни один пользовательский процесс.

Замените *на **/*, если вы хотите сделать это рекурсивно, или вы также можете сделать это с помощьюfind:

find ~/.wine/drive_c/users/t/Temp -type f ! -exec fuser -s {} \; \
   -exec echo rm -f {} +

(замените -exec rm -f {} +на -delete, если ваша реализация findподдерживает это ).

2
28.01.2020, 05:18

Теги

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