Exclui o conteúdo do arquivo, mas mantém o nome e a hierarquia

6

Eu espelhei uma estrutura de diretórios, mas não me importo com o conteúdo dos arquivos, apenas quero manter o nome e a estrutura de tudo.

Como posso substituir o conteúdo de todos os arquivos (não pastas) por "nada" (nulo, 1 byte, string vazia ou algo parecido)?

    
por hensti 27.07.2018 / 01:58

4 respostas

18

Genericamente,

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

ou (cortesia de jordanm ):

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

Em um sistema Linux (ou com o comando truncate do GNU pacote coreutils ):

find /top -type f -exec truncate -s 0 {} +
    
por 27.07.2018 / 02:11
6

com zsh :

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

. para fazer isso apenas para arquivos regulares, D para incluir arquivos e arquivos ocultos em diretórios ocultos.

Para um pequeno número de arquivos, você pode encurtá-lo para :>**/*(D.) .

Para manter o mesmo tamanho para os arquivos, mas torná-los esparsos sem dados (não ocupando lugar no disco, exceto no sistema de arquivos HFS + da Apple, que não suporta arquivos esparsos):

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

Observe que todos os usuários atualizarão a hora da última modificação dos arquivos.

    
por 27.07.2018 / 08:51
1

Se você quiser manter todos os metadados dos arquivos, recomendamos fazer o seguinte:

  • primeiro arquive os metadados dos arquivos usando:

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

  • , em seguida, chame find para remover os arquivos.

Star permite que você extract os metadados de tal arquivo tar chamando:

star -xp -xmeta < out.tar

Isso cria uma árvore de diretórios, que se parece com a árvore original, mas todos os arquivos simples têm tamanho 0.

Se você ligar:

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

os arquivos são todos arquivos esparsos sem conteúdo, mas com o tamanho de arquivo correto.

Observe que o método star também pode ser de interesse, quando você precisa relatar um problema a um autor de software e o problema ocorre apenas com uma árvore de arquivos específica e você não gosta de distribuir o conteúdo do arquivo. arquivos.

    
por 27.07.2018 / 12:31
1

Para completar, aqui está a versão bash:

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

Isso precisa da opção globstar habilitada ( shopt -s globstar ) e, portanto, pelo menos da versão 4. (Mas, se você usar zsh , provavelmente não desejaria manter a versão padrão do Mac OS X .)

    
por 27.07.2018 / 11:09