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