![仅在年底复制目录结构](https://linux22.com/image/1578365/%E4%BB%85%E5%9C%A8%E5%B9%B4%E5%BA%95%E5%A4%8D%E5%88%B6%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84.png)
新年快乐。我有一个解决方案,但除非我在要复制的目录中,否则我无法使其工作。
在2018年年底,我只想将名为2018 /的各个文件夹的目录结构复制到2019 /中。
cd 2018/
find . -type d -exec mkdir -p ../2019/{} \;
这有效。我如何从基目录执行此操作?
find 2018 -type d -exec basename {} \;
给了我文件夹名称,但是
find 2018 -type d -exec mkdir 2019/`basename {}` \;
仍然将 2018 文件夹复制到 2019 文件夹中,并且您会丢失目录树。
我搜索了好几次都没找到简单的答案。有什么想法吗?
编辑 感谢大家的帮助和建议。这个对我来说最有效:
find 2018/* -type d | sed 's/^2018//g' | xargs -I {} mkdir -p 2019"/{}"
答案1
这应该可以解决问题:
for FOLDER in `ls -l 2018/|grep '^d'|awk '{print $9}'`; do mkdir -p 2019/$FOLDER; done
或者
for FOLDER in `find 2018 -type d -exec basename {} \;|grep -v 2018`; do mkdir -p 2019/$FOLDER; done
我希望这有帮助。
答案2
如果你有 mtree,你可以这样做:
$ mkdir 2019
$ mtree -cdp 2018 | mtree -Up 2019
如果你没有 mtree,请按照以下方法安装Archie Cobbs 的 GitHub mtree 移植版在 Ubuntu 16.04.5 LTS 上:
$ mkdir work; cd work
$ # adjust this URL to match the desired version from the GitHub page
$ wget https://s3.amazonaws.com/archie-public/mtree-port/mtree-1.0.4.tar.gz
$ tar xf mtree-1.0.4.tar.gz
$ cd mtree-1.0.4
$ cat README
mtree - Utility for creating and verifying file hierarchies
This is a port of the BSD mtree(1) utility.
See INSTALL for installation instructions.
See COPYING for license.
See CHANGES for change history.
Enjoy!
$ cat INSTALL
Simplified instructions:
1. Ensure you have the following software packages installed:
libopenssl-devel
2. ./configure && make && sudo make install
Please see
https://github.com/archiecobbs/mtree-port
for more information.
$ # I already had openssl installed in my Ubuntu VM, so I forged ahead:
$ ./configure
...
$ make
...
$ sudo make install
$ man mtree
...
$ which mtree
/usr/bin/mtree
我认为作者提到的 OpenSSL 包名称可能自创建说明以来发生了变化。在我的系统上,libssl-dev 是构建支持 SHA256 等的 mtree 所需的包。
高血压,
吉姆
答案3
只是:
cd 2018/
find * -type d -exec mkdir -p ../2019/{} \;
使用“*”而不是“。”将避免选择 2018 目录本身。
如果不通过 cd 进入目录,我会将目录列表放入数组中,并用 mkdir 命令替换年份。例如:
# get list into an array, names can have spaces.
IFS=$'\r\n' dirs=($(find /some/path/2018/* -type d))
let i=0
while [ $i -lt ${#dirs[*]} ]; do
mkdir -p "${dirs[$i]/2018/2019}"
let i=i+1
done