Организация папок

У меня есть несколько папок ("амазонка", "нигер", "рейн",...). Внутри каждой из них у меня есть несколько подпапок ("gfdl", "hadgem", "ipsl",...). Каждая подпапка состоит из 5 подпапок (например, в "amazon", подпапка "gfdl" состоит из 5 подпапок "amazon_gfdl", "amazon_gfdl1",..., "amazon_gfdl5"); а остальные подпапки следуют той же структуре (например, в подпапке "amazon" "ipsl" состоит из 5 подпапок "amazon_ipsl", "amazon_ipsl1", "amazon_ipsl2",... до "amazon_ipsl5".

У меня есть огромное количество папок, следующих той же структуре организации. Поэтому мой вопрос заключается в следующем:

Как организовать каждую папку и подпапку таким образом, чтобы в каждой подпапке ("gfdl", "hadgem", "ipsl",...) было создано 4 новых каталога ("1", "2", "3", "4"); и затем, что папка, например, "amazon_gfdl" (уже присутствует в "gfdl"), копируется в каждый из этих новых каталогов и, наконец, что "amazon_gfdl1" перемещается в новый каталог "1", "amazon_gfdl2" перемещается в новый каталог "2" и так далее!

В настоящее время я использую команду cp и перемещаюсь в каждой подпапке, но это не очень эффективно, и мне может понадобиться дополнительная жизнь, чтобы закончить эту задачу, как эта! Поэтому любые советы или подсказки будут с благодарностью. Большое вам спасибо!

2 ответа

Вы можете запустить этот скрипт, он только выводит команды. Когда он делает то, что вы хотите, замените dont=echo по dont= то есть ничего.

dont=echo
for dir in */*
do if ! [[ "$dir" =~ [1234]$ ]]
   then file=${dir/\//_}
        for i in 1 2 3 4
        do $dont mkdir $dir/$i
           $dont cp -r $dir/$file $dir/$i
           $dont mv $dir$i $dir/$i
        done
   fi
done

Вы должны попробовать написать что-то похожее на это:

for dir in */; do
  echo "Moving into $dir"
  cd "$dir"
  for subDir in */; do
    echo "Moving into $subDir"
    cd "$subDir"
    for num in 1 2 3 4; do
      echo "Moving $dir_$sudDir$num to $num"
      mv -vRi "$dir_$sudDir$num" "$num"
    done
  done
done

Я не проверял это и не рекомендую запускать его до тех пор, пока вы его не протестируете. Некоторые флаги mv не будут работать в Mac OSX из-за версии bash, которую он запускает, но он должен работать в Ubuntu.

Опять же - возитесь с приведенным выше кодом, пока он не сделает то, что вы хотите - вы можете посмотреть в bash для циклов в целом, или, возможно, используя find Команда выполнить аналогичный блок кода в одну строку.

Связанный: Как мне переименовать каталог через командную строку?

Другие вопросы по тегам