С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}
}' {} +
Обратите внимание, что все они будут обновлять время последней модификации файлов.
Для полноты здесь версия bash:
for f in **; do [ -f "$f" ] && [ ! -L "$f" ] && >"$f"; done
Для этого требуется включенная опция globstar
(shopt -s globstar
)и, следовательно, как минимум версия bash 4. (Но если вы хотите использовать zsh
, вы, вероятно, также не захотите придерживаться версии Mac OS X по умолчанию..)
Если вы хотите сохранить все метаданные для файлов, я рекомендую сделать следующее:
сначала заархивируйте метаданные файлов, используя:
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
также может быть интересен, когда вам нужно сообщить о проблеме автору программного обеспечения, и проблема возникает только с определенным деревом файлов, и вы не хотите разглашать содержимое файла. файлы.
В общем,
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 {} +