LINUX.ORG.RU

Скрипт на bash - вложенный цикл

 ,


2

1

Задача проста.

В папке есть ряд каталогов c именем FolderX, X меняется от 1 до 22. В каждой папке Name есть 3 подпапки с именем вида varY, y меняется от 1 до 3. И в каждой папке Var содержится файл File. Нужно создать копию этого файла с именем FileX_Y и переместить в каталог Filesall, который будет находиться там же, где и папки FolderX, в условнокорневом каталоге. Есть скрипт, написанный «в лоб».

#!/bin/bash

mkdir "filesall"

outer=1

for (( i=1; i<=22; i++ ))
do
cd "folder$i"
pwd
inner=1
	for j in 1 2 3
	do

	cd "var$j"
	pwd
	cp file.file file${i}_${j}.file
	echo "file${i}_${j}"
	mv file${i}_${j}.file ../../filesall/

	cd ../
	let "inner+=1"

	done

cd ../
pwd

let "outer+=1"

done

Не работает. Копирует файл из Var1 первой папки Folder1 под разными именами.

Есть второй. По сути, делает тоже, но написан по-другому.

#!/bin/bash


for j in 1 2 3
do
mkdir "filelsall"
cd "filesall"
pwd

for (( i=1; i<=22; i++ )) 
do

cp "../folder$i/var$j/file.file" "file$i_$j.file"

done
cd ..
pwd

done


Последнее исправление: beastie (всего исправлений: 2)
Ответ на: комментарий от Silerus

Спасибо большое! Несколько дней бьюсь, что не так...

А Вас не слишком затруднит привести пример? (я теоретически знаю, что это такое, а по факту ни разу не использовала их еще)

cyplenok
() автор топика
Ответ на: комментарий от cyplenok

посмотри bash guid for beginers там куча примеров, вообщем похоже на с, только входящие параметры можно без скобочек писать

Silerus ★★★★
()

В каждой папке Name есть 3 подпапки

а у каждой мамки есть две подмамки)

nerve ★★
()
#!/bin/bash
cd ./testdir

create_dirs () {
for i in {1..22}; do
    mkdir root$i
    for j in 1 2 3; do
        mkdir ./root$i/child$j
        touch ./root$i/child$j/file
    done
done
}

create_files () {
mkdir ./filesall
for i in {1..22}; do
    for j in 1 2 3; do
        cp ./root$i/child$j/file ./filesall/file${i}_${j}
    done
done
}

case $1 in
    str) create_dirs
    ;;
    file) create_files
    ;;
    *) echo "Usage: `basename $0` str | file"
    ;;
esac

$ ls ./testdir/filesall/
file10_1  file1_2   file13_3  file16_1  file18_2  file20_3  file22_2  file4_2  file6_3  file9_1
file10_2  file12_1  file14_1  file16_2  file18_3  file2_1   file22_3  file4_3  file7_1  file9_2
file10_3  file12_2  file14_2  file16_3  file19_1  file21_1  file2_3   file5_1  file7_2  file9_3
file1_1   file12_3  file14_3  file17_1  file19_2  file21_2  file3_1   file5_2  file7_3
file11_1  file1_3   file15_1  file17_2  file19_3  file21_3  file3_2   file5_3  file8_1
file11_2  file13_1  file15_2  file17_3  file20_1  file2_2   file3_3   file6_1  file8_2
file11_3  file13_2  file15_3  file18_1  file20_2  file22_1  file4_1   file6_2  file8_3

nerve ★★
()
Последнее исправление: nerve (всего исправлений: 1)
#!/bin/bash


for j in 1 2 3
do
mkdir "filelsall"
cd "filesall"
pwd

for (( i=1; i<=22; i++ )) 
do

cp "../folder$i/var$j/file.file" "file$i_$j.file"

done
cd ..
pwd

done


Руки бы тебе оторвать за такое форматирование.

awesomebuntu
()
Ответ на: комментарий от nerve

Спасибо! Вопрос:

#!/bin/bash
cd ./testdir

create_dirs () {
for i in {1..22}; do
    mkdir root$i

Зачем? эта папка уже существует, надо в нее просто зайти.

    for j in 1 2 3; do
        mkdir ./root$i/child$j

Тот же вопрос.

        touch ./root$i/child$j/file
    done
done
}

create_files () {
mkdir ./filesall
for i in {1..22}; do
    for j in 1 2 3; do
        cp ./root$i/child$j/file ./filesall/file${i}_${j}
    done
done
}

case $1 in
    str) create_dirs
    ;;
    file) create_files
    ;;
    *) echo "Usage: `basename $0` str | file"
    ;;
esac

Или я все неверно поняла, и это надо рассматривать не как готовое решение, а как пример функции?

cyplenok
() автор топика
Ответ на: комментарий от cyplenok

первая функция создает структуру директорий как она описана в старпосте (не руками ведь я буду ее создавать).

вторая функция извлекает файлы из этой структуры по вашей хотелке.

соответственно скрипт запускается или с параметром для создания структуры или с параметром для извлечения файлов.

nerve ★★
()
Ответ на: комментарий от nerve

первая функция создает структуру директорий как она описана в старпосте

И что мешает написать вместо этой функции mkdir -p root{1..22}/child{1..3} ?

vodz ★★★★★
()
Ответ на: комментарий от vodz

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

но раз уж на то пошло - где «аналогичная» команда для создания файла во всех директориях?

nerve ★★
()
Ответ на: комментарий от nerve

что-то вроде этого наверно?)

find . -mindepth 2 -type d -execdir touch {}/file \;

nerve ★★
()
Ответ на: комментарий от nerve

Сделала sh файл с кодом

#!/bin/bash

create_files () {
mkdir ./molsall
for i in {1..22}; do
    for j in 1 2 3; do
        cp ./nuc$i/var$j/nuc.mol2 ./molsall/nuc${i}_${j}.mol2
    done
done
}

case $1 in
    str) create_dirs
    ;;
    file) create_files
    ;;
    *) echo "Usage: `basename $0` str | file"
    ;;
esac 

Не работает все равно )=

cyplenok
() автор топика
Ответ на: комментарий от nerve

Из той же папки. Если я правильно поняла Ваш скрипт, то из testdir.

Надо на уровень выше?

cyplenok
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.