ファイルの内容を削除しますが、名前と階層は維持されます

ファイルの内容を削除しますが、名前と階層は維持されます

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

すべてのファイル(フォルダではない)の内容を「なし」(ヌル、1バイト、空の文字列など)に置き換える方法は?

答え1

一般的に言えば、

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

または(によってヨルダン):

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

Linuxシステム(または切り取りコマンド~からGNU coreutilsパッケージ):

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

答え2

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

これらはすべてファイルの最後の変更時間を更新します。

答え3

ファイル内のすべてのメタデータを保存するには、次のことをお勧めします。

  • まず、次のコマンドを使用してファイルのメタデータをアーカイブします。

    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ソフトウェア作成者に問題を報告する必要があり、問題が特定のファイルツリーでのみ発生し、ファイルの内容を公開したくない場合でも、このアプローチは興味深いかもしれません。

答え4

完全性のために、bashのバージョンは次のとおりです。

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

これにはglobstarオプション(shopt -s globstar)を有効にする必要があるため、少なくともbashバージョン4が必要です。 (しかし、それを使用したい場合は、デフォルトのzshMac OS Xバージョンに固執したくないかもしれません。)

関連情報