Форум русскоязычного сообщества Ubuntu


Автор Тема: bash. создание подкаталогов  (Прочитано 1201 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Reedness

  • Автор темы
  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
bash. создание подкаталогов
« : 25 Декабрь 2016, 19:35:40 »
Всем здравствуйте.

Задание такое: создать в каталоге copyfiles подкаталоги file1, file2, file3 и т.д. и скопировать в эти подкаталоги файлы file1, file2, fil3, и т.д. соответственно.
Количество файлов заранее неизвестно и выясняется оно уже в процессе выполнения скрипта.

Вот, что есть:
all=$(ls -f file*.txt | wc -l)
echo "всего копируемых файлов: $all."

count=0

while [ count -lt all ]
do
(( count++ ))
echo "count = $count"
done
if [ ! -d copyfiles ]
then
for dir in copyfiles
for dir2 in files$count
do
mkdir -dir2 $dir/$dir2
done
done
echo "Были созданы каталоги copyfiles и file"
fi

cp file$count.txt copyfiles/file$count
echo "Скопирован файл file$count"
done

Проблема в том, что не получается изменять имя создаваемых каталогов в цикле (files$count в коде). Как по-другому сделать это, кроме тупого ввода имени для каталога каждый раз, я без понятия.
Заранее прошу прощения за возможное "быдлокодерство". С башем знакома всего около суток.
« Последнее редактирование: 25 Декабрь 2016, 19:47:28 от Reedness »

Оффлайн victor00000

  • Забанен
  • Старожил
  • *
  • Сообщений: 15570
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: bash. создание подкаталогов
« Ответ #1 : 25 Декабрь 2016, 21:01:22 »
только смотреть в часы?
Нельзя друзья, дулу - AnrDaemon видите?
~.o

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 2219
    • Просмотр профиля
Re: bash. создание подкаталогов
« Ответ #2 : 25 Декабрь 2016, 22:00:10 »
Там много ошибок, вы лучше делайте построчно. Одна команда получилась, добавляете следующую.
должно быть "ls -1", внутри while должны быть $count и $all, арифметические операции делаются через let,
let count++
должно быть
echo "count="$count
и вверху аналогично,
опять же $copyfiles и его неплохо бы создать командой "mkdir -p copyfiles",
что такое "dir in copyfiles" , я вообще не понял, хотя могу догадываться и вообще переменную
надо объявлять и инициализировать до 1-го использования. Делайте постепенно.
Пётр.

Оффлайн Reedness

  • Автор темы
  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Re: bash. создание подкаталогов
« Ответ #3 : 25 Декабрь 2016, 22:59:08 »
Peter_I, ну, вот. разделила создание общего каталога и подкаталогов. работает. но только в цикл не могу впихнуть. всё-таки не очень хочется каждый раз повторять практически идентичные действия.

all=$(ls -f file*.txt | wc -l)

if [ ! -d copyfiles ]
then
mkdir copyfiles
fi

cd copyfiles
mkdir file1
cd ..
cp file1.txt copyfiles/file1/file1.txt
cd copyfiles

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2628
    • Просмотр профиля
Re: bash. создание подкаталогов
« Ответ #4 : 26 Декабрь 2016, 11:58:36 »
Цитировать
создать в каталоге copyfiles подкаталоги file1, file2, file3 и т.д. и скопировать в эти подкаталоги файлы file1, file2, fil3, и т.д. соответственно.
Количество файлов заранее неизвестно и выясняется оно уже в процессе выполнения скрипта.

Код: (bash) [Выделить]
#!/bin/bash

files="$(ls file*.txt)"
echo "Всего копируемых файлов: $(wc -l <<<"$files")"

while read f
do
        dir="$PWD/copyfiles/${f%.*}"
[ -d "$dir" ] || mkdir -p "$dir" && {
cp "$f" "$dir" && echo "Скопирован файл $f в $dir"
        }
done <<< "$files"

Пользователь добавил сообщение 26 Декабрь 2016, 12:16:58:
или:
Код: (bash) [Выделить]
#!/bin/bash

all=$(ls file*.txt | wc -l)
echo "Всего копируемых файлов: $all"

for ((i=1;i<=all;i++))
do
        dir="$PWD/copyfiles/file${i}"
[ -d "$dir" ] || mkdir -p "$dir" && {
cp "file${i}.txt" "$dir" && echo "Скопирован файл file${i}.txt в $dir"
        }
done
« Последнее редактирование: 26 Декабрь 2016, 13:49:22 от renzrv »

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3339
  • Ubuntu Mate 16.04 х64
    • Просмотр профиля
Re: bash. создание подкаталогов
« Ответ #5 : 26 Декабрь 2016, 13:23:49 »
Код: (bash) [Выделить]
#!/bin/sh
# параметрами выступают директории откуда и директория куда
SRCDIR=$1
DSTDIR=$2

i=0

for file in $(find $SRCDIR -maxdepth 1 -type f -printf "%f\n")
do
    let i+=1
    mkdir -p "$DSTDIR/$file" && cp "$SRCDIR/$file" "$DSTDIR/$file/$file"
    # mkdi# mkdir -p "$DSTDIR/file"$i && cp "$SRCDIR/file"$i "$DSTDIR/file$i/" ## а это на случай если директории должны именоваться именно file1, file2 и т.д
done

Пользователь добавил сообщение 26 Декабрь 2016, 13:27:10:
Reedness, а вообще вы не правильно сформулировали задание.
Надо все файлы с директории скопировать в подкаталоги с теми же именами в директории... Вас не должны волновать имена файлов вообще
« Последнее редактирование: 26 Декабрь 2016, 13:35:15 от EvangelionDeath »
Fujitsu UH552: Intel Core i3-3217U, 16GB DDR3 1600MHz, Intel HD4000, Intel 535 120GB/Ubuntu 16.04 Mate
HP 625: AMD Athlon P320, 4GB DDR3 1333MHz, AMD HD4250, Seagate Momentus/Ubuntu 14.04 Mate

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2628
    • Просмотр профиля
Re: bash. создание подкаталогов
« Ответ #6 : 26 Декабрь 2016, 13:47:14 »
Цитировать
Код: (bash) [Выделить]
for file in
Будет ошибка если в именах файлов попадется пробел.


Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3339
  • Ubuntu Mate 16.04 х64
    • Просмотр профиля
Re: bash. создание подкаталогов
« Ответ #7 : 26 Декабрь 2016, 14:44:17 »
renzrv, не будет, если перед циклом добавить

Код: (bash) [Выделить]
OIFS="$IFS"
IFS=$'\n'
Fujitsu UH552: Intel Core i3-3217U, 16GB DDR3 1600MHz, Intel HD4000, Intel 535 120GB/Ubuntu 16.04 Mate
HP 625: AMD Athlon P320, 4GB DDR3 1333MHz, AMD HD4250, Seagate Momentus/Ubuntu 14.04 Mate

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2628
    • Просмотр профиля
Re: bash. создание подкаталогов
« Ответ #8 : 26 Декабрь 2016, 15:06:01 »
Лучше не менять разделитель, а использовать while read.

Оффлайн Reedness

  • Автор темы
  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Re: bash. создание подкаталогов
« Ответ #9 : 27 Декабрь 2016, 13:03:40 »
Всем большое спасибо за помощь! :)

 

Страница сгенерирована за 0.077 секунд. Запросов: 24.