1

С новым годом. У меня есть решение для этого, но я не могу заставить его работать, если я не нахожусь в каталоге, который я хочу скопировать.

В конце 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"/{}"

3 ответа3

1

Если у вас есть mtree, вы можете сделать это:

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

Если у вас нет mtree, вот как установить порт mtree Арчи Коббса из GitHub в 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 был пакетом, который мне нужен для сборки mtree с поддержкой SHA256 и т.д.

НТН,

Джим

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

Надеюсь, это поможет.

0

Просто:

cd 2018/
find * -type d -exec mkdir -p ../2019/{} \;

используя '*' вместо '.' избегать выбора самого каталога 2018 года.

Без перехода в каталог я бы вывел список каталогов в массив и подставил год в команду 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .