Intereting Posts
Как установить последний флеш-плеер для Iceweasel / Firefox Как загрузчик действительно передает в ядро? Как предотвратить убийство X-сервера с помощью CTRL + C с помощью ловушек bash? Уменьшение шума микрофона Как изменить конфигурацию hotspot для Network Manager? Crontab только 24 часа, но каждые 4 часа Папки Hotmail после добавления еще одного физического объема и увеличения логического тома grub не удается Org-Mode не экспортирует в pdf Как я могу получить настенные часы времени выполнения процесса? Процесс Java зависает, пока я не использую 100% CPU Можно ли использовать один SSH-ключ для каждой учетной записи для каждой учетной записи на данном удаленном сервере? Виртуальный хост-сервер VirtualBox / Vagrant не получает IP-адрес Zsh запрашивает полную ширину с пользовательским вводом в следующей строке Использовать подключенное устройство в качестве источника снимка

Удалить содержимое файла, но сохранить имя и иерархию

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

Как я могу заменить содержимое всех файлов (не папок) на «ничто» (ноль, 1 байт, пустая строка или что-то подобное)?

В общем,

 find /top -type f -exec cp /dev/null {} \; 

или (любезно предоставлено Иорданией ):

 find /top -type f -exec sh -c '> $1' -- {} \; 

В системе Linux (или системе с командой truncate из пакета GNU coreutils ):

 find /top -type f -exec truncate -s 0 {} + 

С zsh :

 for f (**/*(D.)) : > $f 

. чтобы сделать это только для обычных файлов, D чтобы включить скрытые файлы и файлы в скрытых каталогах.

Для небольшого количества файлов вы можете сократить его до :>**/*(D.) .

Чтобы сохранить одинаковый размер для файлов, но сделать их разреженными без данных (таким образом, не занимая места на диске, кроме файловой системы Apple HFS +, которая не поддерживает разреженные файлы):

 find . -type f -exec perl -e ' for (@ARGV) { unless (open F, "+<", $_) {warn "open $_: $!"; next} unless (seek F, 0, 2) {warn "seek $_: $!"; next} $size = tell F; unless (truncate F, 0) {warn "zap $_: $!"; next} unless (truncate F, $size) {warn "fill $_: $!"; next} }' {} + 

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

Если вы хотите сохранить все метаданные для файлов, я рекомендую сделать следующее:

  • сначала заархивируйте метаданные файлов, используя:

    star -c -dump -meta $STARTDIR > out.tar

  • затем вызовите find чтобы удалить файлы.

Star позволяет extract метаданные из такого архива tar, вызывая:

 star -xp -xmeta < out.tar 

Это создает дерево каталогов, которое выглядит как исходное дерево, но тогда все простые файлы имеют размер 0.

Если вы позвоните:

 star -xp -xmeta -force-hole < out.tar 

все файлы - разреженные файлы без содержимого, но с правильным размером файла.

Обратите внимание, что метод « star также может быть интересен, когда вам нужно сообщить о проблеме автору программного обеспечения, и проблема возникает только с определенным деревом файлов, и вы не хотите отдавать содержимое файлов.

Для полноты здесь версия bash:

 for f in **; do [ -f "$f" ] && [ ! -L "$f" ] && >"$f"; done 

Для этого требуется опция globstar ( shopt -s globstar ) и, следовательно, как минимум bash версии 4. (Но если вы используете zsh вы, вероятно, также не захотите придерживаться версии по умолчанию для Mac OS X.)