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

проверка разрешения на целевой машине для пользователя pi .

7
27.07.2018, 12:20
4 ответа

С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}
  }' {} +

Обратите внимание, что все они будут обновлять время последней модификации файлов.

6
27.01.2020, 20:13

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

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

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

1
27.01.2020, 20:13

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

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

    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также может быть интересен, когда вам нужно сообщить о проблеме автору программного обеспечения, и проблема возникает только с определенным деревом файлов, и вы не хотите разглашать содержимое файла. файлы.

1
27.01.2020, 20:13

В общем,

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

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

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

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

find /top -type f -exec truncate -s 0 {} +
19
27.01.2020, 20:13

Теги

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