如何以所有文件替换为具有相同文件名的零大小文件的方式复制目录

How to copy a directory in a way that all files replaced by zero size files with the same filename

例如,我有一个名为aaa的目录,在aaa目录下有名为11.txt22.exe33.mp3的文件。

现在我想做这个目录的镜像,但是我只想要目录的结构而不是内容,即将aaa复制到bbbbbb 下的文件应为 11.txt.zero22.exe.zero33.mp3.zero.zero 扩展名表示所有复制的文件的文件大小应为零。

该目录通常包含子文件夹。

如何使用 windows CMD 和 linux bash 实现此目的?

首先复制目录结构:

find aaa -type d -print  | sed 's/^aaa/bbb/' | xargs mkdir -p

第二,触摸文件:

find aaa -type f -print | sed 's/^aaa/bbb/' | sed 's/$/\.zero/' | xargs touch

结果:

[trak_000.COGITATOR] ➤ ls -lR aaa bbb
aaa:
total 0
drwxrwxr-x    1 trak_000 UsersGrp         0 Jun 12 12:20 q1

aaa/q1:
total 1
-rw-rw-r--    1 trak_000 UsersGrp       194 Jun 12 12:20 test1.txt

bbb:
total 0
drwxrwxr-x    1 trak_000 UsersGrp         0 Jun 12 12:24 q1

bbb/q1:
total 0
-rw-rw-r--    1 trak_000 UsersGrp         0 Jun 12 12:24 test1.txt.zero

稍微好一点:

在您要复制的目录中:

  • 创建目录: find -type d -exec mkdir -p ../new_dir/{} \;

  • 触摸文件: find -type f -exec touch ../new_dir/{}.zero \;

原始方法

我会分两步完成:

复制所有包含rsync -r的文件:

rsync -r origin_dir/ target_dir/

遍历 target_dir/ 中的文件,清空它们并重命名为 .zero:

find target_dir/ -type f -exec sh -c 'f={}; > $f; mv $f $f.zero' \;

如果原目录下的文件比较大,当然不是很理想,因为我们是先拷贝再清空。

测试

$ tree aa
aa
├── a
├── a1
│   └── d
├── b
├── c
└── d

1 directory, 5 files

$ ll aa/*
-rw-r--r-- 1 me me  6 Jun 12 11:16 aa/a
-rw-r--r-- 1 me me  6 Jun 12 11:16 aa/b
-rw-r--r-- 1 me me  6 Jun 12 11:16 aa/c
-rw-r--r-- 1 me me  6 Jun 12 11:16 aa/d

aa/a1:
total 0
-rw-r--r-- 1 me me  0 Jun 12 11:16 d
$ rsync -r aa/ bb/
$ tree bb
bb
├── a
├── a1
│   └── d
├── b
├── c
└── d

1 directory, 5 files
$ find bb/ -type f -exec sh -c 'f={}; > $f; mv $f $f.zero' \;
$ tree bb
bb
├── a1
│   └── d.zero
├── a.zero
├── b.zero
├── c.zero
└── d.zero

1 directory, 5 files
$ ll bb/*
-rw-r--r-- 1 me me  0 Jun 12 11:23 bb/a.zero
-rw-r--r-- 1 me me  0 Jun 12 11:23 bb/b.zero
-rw-r--r-- 1 me me  0 Jun 12 11:23 bb/c.zero
-rw-r--r-- 1 me me  0 Jun 12 11:23 bb/d.zero

bb/a1:
total 0
-rw-r--r-- 1 me me 0 Jun 12 11:23 d.zero
@echo off
    setlocal enableextensions disabledelayedexpansion

    set "source=c:\somewhere\aaaa"
    set "target=x:\anotherplace\bbbb"

    robocopy "%source%\." "%target%\." /s /e /create
    for /r "%target%" %%a in (*) do ren "%%~fa" "%%~nxa.zero"

此处robocopy命令将处理文件夹递归和零文件生成。完成后,目标结构中的所有文件都将重命名。

使用 tree 命令获取源文件夹的递归列表,然后创建零大小结构,对子目录使用 mkdir,对文件使用 touch。