如何以所有文件替换为具有相同文件名的零大小文件的方式复制目录
How to copy a directory in a way that all files replaced by zero size files with the same filename
例如,我有一个名为aaa
的目录,在aaa
目录下有名为11.txt
、22.exe
、33.mp3
的文件。
现在我想做这个目录的镜像,但是我只想要目录的结构而不是内容,即将aaa
复制到bbb
。 bbb
下的文件应为 11.txt.zero
、22.exe.zero
、33.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。
例如,我有一个名为aaa
的目录,在aaa
目录下有名为11.txt
、22.exe
、33.mp3
的文件。
现在我想做这个目录的镜像,但是我只想要目录的结构而不是内容,即将aaa
复制到bbb
。 bbb
下的文件应为 11.txt.zero
、22.exe.zero
、33.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。