3

Я унаследовал структуру папок в проекте и хотел бы немного ее упростить. У меня есть полный каталог папок (1-й уровень), и у каждой из этих папок есть несколько папок (2-й уровень), и у каждой из этих папок есть несколько файлов внутри. Это выглядит примерно так:

root
|-- dir1
|    |-- dir1.1
|    |      +- file1.txt
|    |-- dir1.2
|    |     +- file2.txt
|    +-- dir1.N
|          +- fileN.txt
|-- dir2
|    |-- dir2.1
|          +- file3.txt
|-- dir3
|    |-- dir3.1
|          +- file4.txt

и т.п.

Я хотел бы удалить все папки x.1, упростить структуру и переместить все файлы из этих папок на один уровень вниз:

root
|-- dir1
|     +- file1.txt
|     +- file2.txt
|     +- fileN.txt
|-- dir2
|     +- file3.txt
|-- dir3
|     +- file4.txt

Как мне сделать что-то подобное через bash/zsh?

2 ответа2

1

Я не знаю, будет ли это работать в zsh, но я ожидаю, что это будет работать в bash (хотя я еще не полностью протестировал это):

for f in */*/*
do
        mv "$f" "$(dirname "$(dirname "$f")")"
done

for f in */*
do
        if [ –d "$f" ]
        then
                rmdir "$f"
        fi
done

PS В Unix (в отличие от ботаники, т. Е. Реального мира) деревья имеют свои корни наверху.  Поэтому эта операция будет считаться перемещением файлов вверх по структуре каталогов.

0
for d in */*; do
    mv "$d"/* "$d"/..
    rm -r "$d"
done

Это не работает, если второй уровень содержит пустые каталоги или файлы.

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