Мне нужно переместить файлы из каталога в каталог внутри каталога и удалить папку, из которой я их перемещаю. Мне нужен рекурсивный скрипт. Структура каталогов:

/Folder0/Alphabetic_folder/Folder_name/DeleteFolder

/Folder0/A/Folder1/DeleteFolder
/Folder0/B/Folder2/DeleteFolder

DeleteFolder всегда имеет то же имя, что и info . Мне нужно что-то вроде:

  1. перейти в каталог (алфавитный)
  2. для всех папок перейдите внутрь, если в текущей папке есть info папка mv *.* , удалите info (это будет: mv info/* ./ && rm info)
  3. если info нет, выход из папки
  4. перейти к следующей папке

Я уверен, что это некоторая тривиальная проблема с некоторыми навыками сценария, но мои навыки сценария низки в этой проблеме.

2 ответа2

1

UPD. это будет работать лучше :)

find -depth -print0 |  while read -d '' -r dir; do if [[ $dir == *info ]]; then mv "$dir"/* /tmp; rmdir "$dir"; fi; done

старый ответ здесь:

#!/bin/bash
cd /Folder0
for i in `ls`; do #get list of files and dirs in a folder0
    if [ -d $i ]; then #if list item is a folder
    cd $i   #then go inside (in you ex its folder A)
    for j in `ls`; do #list folders and files
            if [ -d $j ]; then #if item is folder
                    cd $j            #go inside (in your ex - Folder1)
                    mv info/* /any_folder_you_want #it will not move files if there is an error
                    rmdir info/ #it will not remove dir if it is not empty
                    cd .. #(go down)
            fi #(go to the next folder Folder2)
    done;  #end of folder A
    cd ..  #go down 
    fi     #next folder B...
done

Вы должны изменить часть с помощью mv и rmdir для проверки того, что вы получаете правильные результаты, просто поместите туда ls и прокомментируйте строки с помощью mv и rmdir:

#mv info/* /any_folder_you_want #it will not move files if there is an error
ls
#rmdir info/ #it will not remove dir if it is not empty

Вы должны запустить этот скрипт за пределами Folder1.

вопросы?

1

Предполагая, что поиск для всех альфа-каталогов из рабочего каталога:

dirs=$(find [a-z][A-Z]* -type d -name info) 
for f in $dirs; do echo "$f/*" done     # first test it works to requirements

for f in $dirs; do mv "$f/*" "$f"/..; rmdir "$f"; done # working version with mv and rmdir

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