仅在年底复制目录结构

仅在年底复制目录结构

新年快乐。我有一个解决方案,但除非我在要复制的目录中,否则我无法使其工作。

在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

相关内容