web-dev-qa-db-ja.com

ファイルのコンテンツを削除しますが、名前と階層は保持します

ディレクトリ構造をミラーリングしましたが、ファイルの内容は気にせず、すべての名前と構造を保持したいだけです。

すべてのファイル(フォルダーではない)の内容を「何もない」(null、1バイト、空の文字列など)に置き換えるにはどうすればよいですか?

7
hensti

一般的に、

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

または( jordanm の礼儀):

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

Linuxシステム(または GNU coreutilsパッケージtruncateコマンド を使用するシステム):

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

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

完全を期すため、ここではbashバージョンを示します。

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

これには、globstarオプションを有効にする必要があります(shopt -s globstar)、したがって少なくともbashバージョン4(ただし、zshを使用する場合は、おそらくデフォルトのMac OS Xバージョンを使いたくないでしょう)。

1
David Ongaro

ファイルのすべてのメタデータを保持する場合は、次の手順を実行することをお勧めします。

  • 最初に、以下を使用してファイルのメタデータをアーカイブします。

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

  • 次に、findを呼び出してファイルを削除します。

Starでは、次のように呼び出すことで、そのようなtarアーカイブからのメタデータをextractできます。

star -xp -xmeta < out.tar

これにより、元のツリーのように見えるディレクトリツリーが作成されますが、すべてのプレーンファイルのサイズは0になります。

あなたが呼び出す場合:

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

ファイルはすべて、コンテンツがなく、適切なファイルサイズのスパースファイルです。

ソフトウェアの作成者に問題を報告する必要があり、問題が特定のファイルツリーでのみ発生し、コンテンツの内容を提供したくない場合は、starメソッドも興味深いかもしれません。ファイル。

1
schily