При принятии '====' под ключевыми словами раздела следующий Python решил бы проблему, не имея необходимость быть явным на именах раздела:
import sys
from collections import OrderedDict
combined = OrderedDict()
seperator = '===='
for file_name in 'f1.txt f2.txt'.split(): #sys.argv[1:]:
with open(file_name) as fp:
lines = fp.readlines()
data = []
while len(lines):
# reverse over the lines
line = lines.pop(-1)
if not line.strip(): continue # skip empty
if line.startswith(seperator):
name = lines.pop(-1)
section = combined.setdefault(name, [])
section.extend(reversed(data))
data = []
else:
data.append(line)
for idx, k in enumerate(reversed(combined)):
if idx != 0:
print # insert empty line before all but first
sys.stdout.write(k)
print('=' * len(k))
for line in combined[k]:
sys.stdout.write(line)
Необходимо дать имена файлов на вызове командной строки.
Это генерирует вывод:
Numbers
========
1
2
3
4
5
6
Letters
========
A
B
C
D
E
F
Те файлы, которые вы удалили, на самом деле могут быть открыты другим процессом. В этом случае файловое пространство станет доступным, когда этот процесс закроет свой хэндл к файлу.
Вы можете просмотреть эти файлы с помощью lsof
:
lsof |grep "var/log"|grep deleted
Согласно man-странице trash-put , trash-put помещает файлы в корзину, которая определена в Спецификации корзины FreeDesktop.org .
В главе Каталоги корзины , удаление мусора следует за таким резервным процессом:
$ XDG_DATA_HOME / Trash
. В вашем случае это может быть / root / Trash
для root. Также возможно, что sudo пропустил $ XDG_DATA_HOME
, поэтому также попробуйте поискать его в своей корзине. Это основной используемый мусор . $ XDG_DATA_HOME
, можно использовать корзину в верхних каталогах подключенных каталогов.
$ topdir / .Trash / $ UID
можно попробовать сначала. $ topdir / .Trash
не существует), используйте $ topdir / .Trash- $ UID
. В вашем случае попробуйте найти его в /. Trash-0
, поскольку sudo
делает ваш UID корневым. Обновление:
Использование «корневого мусора» дает мне больше.
Из действительно старого руководства , в котором упоминается gksudo nautilus '/root/.Trash/'
, .Trash
(вместо Trash
как в fd.o) в корневом каталоге $ XDG_DATA_HOME
может быть хорошим вариантом для начала.
Согласно действительно старый вопрос на китайском языке , в котором .Trash-root
создается для съемного диска запрашивающей стороны, некоторые реализации используют имя пользователя вместо числового UID.
Псевдонимы не будут вызываться при использовании sudo
:
$ alias a=ls
$ sudo a
sudo: a: command not found
Это означает, что файлы были фактически удалены а не в мусорное ведро.
Если есть процессы, которые все еще держат файлы открытыми, например для записи в них пространство, используемое файлами, не будет освобождено до тех пор, пока эти процессы не закроют файлы или не завершатся.
Как было указано в комментарии и ответе, проблема заключается в расширении вашего псевдонима.
Но для этого есть решения:
Если вы хотите, чтобы sudo
работал со всеми вашими псевдонимами (и таким образом обходил проблему, указанную @Kusalananda ), вы можете добавить следующий псевдоним в свой файл псевдонимов:
alias sudo='sudo '
Если бы вы сделали это, sudo rm
было бы расширено до sudo trash-put
, как вы и ожидали.
Чтобы ответить на комментарий @Dubu о том, что псевдонимы работают только как первое слово команды :, если вы добавите флаг -g
в определение псевдонима, он станет глобальным и будет работать, даже если не находится в командной позиции.. Вы могли бы сделать это с вашим псевдонимом rm
. Однако вы, вероятно, не хотите иметь другие неприятные сюрпризы с sudo
, поэтому первый метод здесь более уместен. Это более актуально, если вы хотите, например, установить псевдоним для передаваемой по каналу команды (, например.alias -g pl='| less'
).
Что касается расположения корзины при использовании trash-cli
с sudo
, на это отвечает @Arthur2e5. Я просто могу добавить, что в моем случае это:
/home/.Trash-0