3

Итак, сегодня я пытался заархивировать большую папку (которая имеет большой вложенный набор подпапок) в Linux. Я сделал:

gzip -r bigfolder bigfolder.gz

и после того, как это продолжалось в течение нескольких минут, я понял, что это не будет один большой файл gz, а вместо этого будет индивидуально архивировать каждый файл (но не каталог) внутри bigfolder . Итак, я ctrl - c это сделал.

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

Так я и сделал:

gunzip -r bigfolder

и это, кажется, вернуло все это к норме. Тем не менее, я беспокоюсь, что из-за того, что я ctrl- c 'd it, там может быть сломанный файл, который был на полпути в архиве или что-то в этом роде.

Насколько я понимаю, в то время как ctrl- z просто убьет его мгновенно, ctrl- c немного более "мягок" и с большей вероятностью позволит небольшому подпроцессу, например, сжать один из отдельных файлов, закончить до остановки. Но, как вы можете догадаться, мое понимание этих вещей не слишком точное.

Я не имею копию bigfolder , которую я могу получить diff против , чтобы увидеть , если он сломан. Это может быть сломано, как вы думаете?

1 ответ1

2

Во-первых, не волнуйтесь, ваша папка не сломана.

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

Теперь, когда вы нажимаете ctrl - c, оболочка по умолчанию отправляет сигнал SIGINT процессу, который выполняется на переднем плане. Этот сигнал может быть перехвачен запущенным процессом, и поэтому процесс может обработать этот сигнал, как это делает gzip . gzip есть возможность выйти изящно.

Если вы нажмете ctrl - z, оболочка отправит сигнал SIGTSTP который приостанавливает (останавливает) процесс. В случае SIGTSTP , gzip также справится с этим, потому что он также может быть перехвачен.

Вы не должны убивать (kill -9 <pid>) процесс, потому что этот сигнал (SIGKILL) не может быть перехвачен процессом, и поэтому gzip не может его обработать. Но даже тогда оригинальный файл все еще будет там.

Заключение:

Давайте предположим, что gzip сжимал огромный файл в тот момент, когда вы нажали Ctrl- C. В результате gzip прерывает сжатие в том файле, с которым работал, и удаляет частично сжатый файл. Теперь некоторые файлы сжаты, некоторые нет.

С gunzip -r folder все файлы будут распакованы в исходное состояние. Единственная проблема может быть, если в исходном каталоге были файлы, которые были сжаты; те теперь несжатые.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .