Обработайте каждую строку от текстового файла и удалите связанные файлы из диска

Не без резервного копирования, повторного разделения, mkfs и восстановления, по крайней мере, c0d0p[56789] (принимающий разделы пронумерованы последовательно согласно дисковому расположению).

Если необходимо было перейти ко всему усилию по выполнению этого, израсходовать немного больше усилия установить и настроить lvm и использовать логические тома, а не разделы - это даст Вам намного больше гибкости в следующий раз, когда необходимо вырастить или уменьшить файловую систему (или если Вы добавляете второй диск).

(также, трудно видеть, почему любой даже потрудился бы делать много небольших разделов на маленьком диске в эти дни. Это раньше было обычной практикой, но диски раньше были крошечными также. в эти дни стычка и неудобство, это вызывает больше, чем, перевешивают незначительные преимущества),

Так, короткий ответ нет.

Однако можно сделать каталог на / приложениях (например,/apps/stuff) и move+symlink файлы от / до/apps/stuff. Например:

 mkdir /apps/stuff
 mv /usr/share/doc /apps/stuff
 ln -s /apps/stuff/doc/ /usr/share/

пока Вы не перемещаете файлов или каталогов, которые требуются во время начальной загрузки (включая все / и т.д., / мусорное ведро,/sbin), все будет продолжать работать (хотя Вам, вероятно, придется перезагрузить или по крайней мере уничтожить и перезапустить некоторые процессы, если какой-либо из файлов, которые Вы переместили, считается открытый некоторым процессом),

BTW вместо mv, это - обычно лучшая идея скопировать файлы, пока Вы сохраняете владельца, группу и полномочия. например, используйте cp -a или rsync или даже старая рабочая лошадь cd /path/to/src ; tar cf - . | (cd /path/to/dest ; tar xf -) Затем, когда файлы скопировали, или удаляют их (или перемещают их из пути временно), и создайте символьную ссылку. когда это сделано, протестируйте это, все работает правильно - если это, затем удалите оригинал с корневой фс, например.

mkdir /apps/stuff
rsync -ax /usr/share/doc /apps/stuff
mv /usr/share/doc /usr/share/doc.bak
ln -s /apps/stuff/doc/ /usr/share
# do your testing now
rm -rf /usr/share/doc.bak

Обратите внимание, что важно оставить запаздывание / от исходного аргумента в rsync здесь (т.е. использование /usr/share/doc вместо /usr/share/doc/) иначе rsync будет думать, что Вы хотите скопировать все в/usr/share/doc/к/apps/stuff, а не к/apps/stuff/doc

2
18.01.2014, 01:07
2 ответа

Опасность: совершенно законно для путей Unix содержать новые строки. Если какой-либо из Ваших путей содержит новые строки, это потенциально опасно. Рассмотреть использование \0 разделить имена файлов вместо этого при помощи GNU find -print0 опция и затем обработка их использующий GNU xargs' -0 опция.


Можно использовать следующее:

files=()

while IFS= read -r file; do
    files+=( "$file" )
done < ind_soapr_db40.txt

rm -r -- "${files[@]}"

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

Если у Вас есть bash4 +, можно вместо этого использовать mapfile:

mapfile -t files < ind_soapr_db40.txt
rm -r -- "${files[@]}"
2
27.01.2020, 22:13

Эта острота Perl должна работать, даже если Ваши имена файлов имеют новые строки:

perl -000ne 'unlink (/(.+?\/[^\/]+)\n/sg);' list 

Для рекурсивного удаления каталогов и их содержания попробуйте это:

perl -000ne 'use File::Path; rmtree (/(.+?\/[^\/]+)\n/sg);' list 

Объяснение

  • -000 : активируйте режим абзаца, читает весь файл сразу.
  • -ne : считайте файл, данный как аргумент (-n) и запущенный скрипт, мимо которого проходят -e.

  • /(.+?\/[^\/]+)\n/sg : ищите любой символ, сопровождаемый a /, затем как многие не -/ символы как возможные (включая новые строки благодаря s модификатор) до следующей новой строки. Так как имена файлов не могут содержать /, это должно выбрать целый путь и отдельного EA

  • Передайте соответствия (имена файлов), возвращенные регулярным выражением выше к unlink() удалить их.

0
27.01.2020, 22:13
  • 1
    мне нравится это решение! Это, кажется, работает действительно хорошо, но как я заставляю это удалять каталоги рекурсивно? Ваше предложение только удаляет соответствие файлам. –  etho201 18.01.2014, 07:41
  • 2
    @user2554129 видит обновленный ответ для версии, которая удаляет каталоги. Однако, если Ваши имена файлов на самом деле не содержат новые строки (который возможен, но не очень вероятно), используйте \ответ @ChrisDown, который является классиком *, отклоняют путь. –  terdon♦ 18.01.2014, 15:47

Теги

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