У меня есть похожая структура файла:

/home/dave/documents/static/
/home/static/
/home/dave/pictures/static/
/home/dave/otherfolders/
...

Я хочу скопировать из этого каталога только папки с именем static . Эти папки могут быть также подпапками. И он должен сформировать ту же структуру в новой папке, что и раньше. То есть:

cp -r /home/* /otherhome/

Я пробовал это:

find home/ -name 'static' -exec cp -r '{}/*' 'otherhome/{}' ';'

Но я получаю сообщения об ошибках, которые /home/dave/documents/static/* и другие статические папки не существуют. Я думаю, я не могу объединить имена файлов с /* . Есть идеи как это сделать?

1 ответ1

2

Проблема в том, что эти каталоги не существуют, когда вы пытаетесь скопировать их. Вы должны сделать их в первую очередь.

find home -type d -name 'static' -print0 | while IFS= read -rd '' dir; do 
    newdir="${dir#home/}"
    mkdir -p otherhome/"$newdir"   
    cp -R "$dir" otherhome/"${newdir%static}"
done

Нам нужно удалить home/ из исходных имен каталогов, а затем создать новую иерархию папок (mkdir -p). Затем мы копируем содержимое рекурсивно, но нам также нужно удалить static с конца нового каталога, чтобы не создавать static/static .

Там может быть более красивый способ достичь этого.

Пример до и после:

.
├── home
│   ├── dave
│   │   ├── documents
│   │   │   └── static
│   │   │       └── Untitled.txt
│   │   ├── otherfolders
│   │   └── pictures
│   │       └── static
│   │           └── Untitled2.txt
│   └── static
└── otherhome
    ├── dave
    │   ├── documents
    │   │   └── static
    │   │       └── Untitled.txt
    │   └── pictures
    │       └── static
    │           └── Untitled2.txt
    └── static

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