연말에만 디렉토리 구조 복사 -exec basename

새해 복 많이 받으세요. 이에 대한 해결책이 있지만 복사하려는 디렉토리에 있지 않으면 작동하지 않습니다.

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"/{}"



답변

이 트릭을 수행해야합니다.

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

이게 도움이 되길 바란다.


답변

mtree를 가지고 있다면 다음과 같이 할 수 있습니다 :

$ mkdir 2019
$ mtree -cdp 2018 | mtree -Up 2019

mtree가없는 경우 Ubuntu 16.04.5 LTS의 GitHub 에서 Archie Cobbs의 mtree 포트 를 설치하는 방법은 다음과 같습니다.

$ 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를 빌드하는 데 필요한 패키지였습니다.

HTH,


답변

다만:

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


답변