Сайт | Скачать | Видео | Wiki

Автор Тема: Скрипт копирования (mv ; find)  (Прочитано 1526 раз)

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

Оффлайн totiks2012

  • Постоялец
  • ***
  • Сообщений: 173
  • Репутация: +4/-0
Скрипт копирования (mv ; find)
« : 10 Май 2017, 21:01:10 »
Никак не решался написать,так как не хотел отвлекать знающих людей от важных дел, но не удержался...
Сразу оговорюсь в интернэтах пытаюсь найти решение, уже с неделю,но многое не понимаю,это дело для меня новое...но конкретного решения свой задачи не нашел.
  У меня возникла  задача,необходимо большую группу файлов,распределить по пять файлов каждые в свою папку,для ее решения вырисовается следующий алгоритм ,в папке /home/A есть группа файлов, нужно в этой папке создать папку №1,  в  папку №1 из корневого перенести файл созданый по времени раньше всех, повторить это пять-шесть раз,потом создать папку №2, и повторить цикл, как создать в bash папку я знаю, циклам научился, не знаю какие параметры задать mv чтоб он перенес файл не по имени а по времени создания,то есть чтоб я не задавал ему имя файла для переноса,а чтоб он перенес самый ранний файл, или mv не умеет такое, если не умеет подскажите пожалуйста как можно реализовать поиск самого раннего файла, и перенос его из одной папки в другую,спасибо.

upd: по ходу нужно использовать find ,но опять таки не совсем понимаю как это сделать...
upd2: В идеале я ищу метод способный перенести самый первый файл из корневой папке в ново созданную.
« Последнее редактирование: 11 Май 2017, 09:38:39 от sfs »

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 22124
  • Репутация: +164/-0
    • PuppyRus-A
Re: копирование в терминале
« Ответ #1 : 11 Май 2017, 09:37:17 »
нужно использовать find
да
не совсем понимаю как это сделать...
man find
ищу метод способный перенести самый первый файл из корневой папке в ново созданную.
Если костыльно без find - может mv "`ls -1 /путь |head -1`" ...

Оффлайн DdShurick

  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 5746
  • Репутация: +146/-0
  • Старый чайник
Re: Скрипт копирования (mv ; find)
« Ответ #2 : 11 Май 2017, 09:50:58 »
MAN find.
Примерно так:cd ~/A
mkdir 1
find . -type f -mmin -2 -exec mv {} 1/ \; [code]
В данном примере будут перемещены файлы созданные не более 2 минут назад. Цикл в данном случае не нужен.
Моноблок Lenovo IdeaCentre c200
Netbook Acer 722 c6ckk (AMD C-50 Ontario, Radeon HD 6250)
Nettop Asus Eee Box PC B202 (atom N270, intel GMA 950)

Оффлайн totiks2012

  • Постоялец
  • ***
  • Сообщений: 173
  • Репутация: +4/-0
Re: Скрипт копирования (mv ; find)
« Ответ #3 : 11 Май 2017, 11:49:07 »
спасибо вечером буду пробовать, оба варианта хороши .
« Последнее редактирование: 11 Май 2017, 11:57:38 от totiks2012 »

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 22124
  • Репутация: +164/-0
    • PuppyRus-A
Re: Скрипт копирования (mv ; find)
« Ответ #4 : 11 Май 2017, 12:13:03 »
Мой хорош только для тех, кому лень читать man find  :)

Оффлайн totiks2012

  • Постоялец
  • ***
  • Сообщений: 173
  • Репутация: +4/-0
Re: Скрипт копирования (mv ; find)
« Ответ #5 : 11 Май 2017, 18:33:46 »
sfs  :)
вот что написал по мотивам , утрених советов,второй вариант Дядь Шурика не пробовал, но обязательно попробую позже, мне бы с этим разобратся
вот код:
1. #!/bin/bash
2. i=0
3. while [ $i -lt 5 ]
4. do
5.   cd ~/a
6.   mkdir ~/i $i
7.   i=$[$i+1]
8. done
9. col_file=0
10. while [ $col_file -lt 25 ]
11. do
12.    col_file=$[$col_file+1]
13.    col_dir=0 
14.    while [ $col_dir -lt 5 ]
15.    do
16.       cd ~/Музыка/
17.       mv "`ls -1  |head -1`" ~/a/col_dir $col_dir
18.       echo ~/a/$col_dir
19.       col_dir=$[$col_dir+1] 
20.   done
21. done

скрипт папки создает но терминал ругается :mv: указанная цель '0' не является каталогом,
вероятно в причину того что в строке 17. mv "`ls -1  |head -1`" .~/a/col_dir $col_dir ,    -col_dir является числовой переменной а терминалу видать  нужна строковая,но мне  непонятно почему mkdir не ругнулся на число,видать тут дело в другом,но в чем, почти близок к решению,сейчас буду искать,но если не смогу найти,разрешите  пожалуйста обратится к вам еще за помощью.

upd: оказывается очень полезно выводить на печать все то что делаешь, echo ~/a/col_dir $col_dir выдало ~/a/col_dir 0 то есть нужно было убрать лишний col_dir, выглядит так echo ~/a/$col_dir

« Последнее редактирование: 12 Май 2017, 07:56:02 от totiks2012 »

Оффлайн totiks2012

  • Постоялец
  • ***
  • Сообщений: 173
  • Репутация: +4/-0
Re: Скрипт копирования (mv ; find)
« Ответ #6 : 11 Май 2017, 23:28:46 »
Пишу новым ответом чтоб  было более читабельней,может кому мой скромный опыт пригодится.В общем Алилуя ,задача решена
вот код:
1. #!/bin/bash
2. i=0
3. while [ $i -lt 20 ]
4. do
5.    cd ~/a
6.    mkdir ~/i $i
7.    i=$[$i+1]
8. done
9. col_file=0
10. while [ $col_file -lt 100 ]
11. do
12.   col_file=$[$col_file+1]
13.   col_dir=0 
14.   while [ $col_dir -lt 20 ]
15.   do
16.     cd ~/Музыка/
17.     mv --f "`ls -1  |head -1`" ~/a/$col_dir
18.    #echo ~/a/$col_dir
19.    col_dir=$[$col_dir+1] 
20.   done
21. done

скрипт работает так в каталог /Музыка выгружаем,группу mp3
смотрим сколько файлов в каталоге, делим на пять ,целое число от деления это наше количество подкаталогов,которые создадутся в каталоге/ а, в строке 3 их задаем, а также в строке 14,в моем случае их 20,в строке 10 задаю количество файлов их у меня 100 штук, сохраняем скрипт ,задаем на исполнение,и все файлы будут распределенны по папкам, по пять штук,
  Sfs и Дядя Шурик ,спасибо вам от всей души  :D ,вы не представляете от какого гемора меня освободили,у меня сейчас на руках,штук 25 CD дисков с mp3, от дружбана, он попросил с каждого диска подготовить для 5 флешек,так чтоб на флешке,мп3 были в подпапках по пять штук,в папке, у него очень страный mp3 плеер в машине,он не видит файлы если они свалены в кучу, а так он видит все,еще раз спасибо!!!

upd: вижу возможность усовершенствования скрипта, можно добавить немного интерактивщины )))
« Последнее редактирование: 12 Май 2017, 09:21:18 от totiks2012 »

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 22124
  • Репутация: +164/-0
    • PuppyRus-A
Re: Скрипт копирования (mv ; find)
« Ответ #7 : 12 Май 2017, 09:41:54 »
Скрипты лучше выкладывать
так и без нумерации
Чтобы охватить весь спектр любительского программирования - можно еще GUI написать на yad или gtkdialog

Оффлайн totiks2012

  • Постоялец
  • ***
  • Сообщений: 173
  • Репутация: +4/-0
Re: Скрипт копирования (mv ; find)
« Ответ #8 : 12 Май 2017, 10:15:58 »
пожалуй рано мне к Gui , пойду ка я поищу хорошую книгу по bash, я недооценивал его, несколько строк кода а такая экономия времени, и еще это как итереснная игра квест, только круче

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 22124
  • Репутация: +164/-0
    • PuppyRus-A
Re: Скрипт копирования (mv ; find)
« Ответ #9 : 12 Май 2017, 11:06:34 »
поищу хорошую книгу по bash
Инета достаточно
Тут важнее практика
итереснная игра квест, только круче
GUI еще интереснее, но без sh sed awk вряд ли получится

Оффлайн totiks2012

  • Постоялец
  • ***
  • Сообщений: 173
  • Репутация: +4/-0
Re: Скрипт копирования (mv ; find)
« Ответ #10 : 12 Май 2017, 21:29:43 »
а вот код с интереактивностью:
#!/bin/bash
i=0
mkdir ~/a
echo "введите сколько файлов в каталоге:"
read q
maps=$[$q/5]
while [ $i -lt $maps ]
do
  cd ~/a
  mkdir ~/i $i
  i=$[$i+1]
done
col_file=0
while [ $col_file -lt $q ]
do
  col_file=$[$col_file+1]
col_dir=0 
while [ $col_dir -lt $maps ]
do
  cd ~/Музыка/
  mv --f "`ls -1  |head -1`" ~/a/$col_dir
#  echo ~/a/$col_dir
  col_dir=$[$col_dir+1] 
done
done

теперь достаточно, скопировать файлы в папку /Музыка, запустить скрипт ,указать количество ваших файлов,а дальше скрипт все сделает сам.

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 22124
  • Репутация: +164/-0
    • PuppyRus-A
Re: Скрипт копирования (mv ; find)
« Ответ #11 : 13 Май 2017, 08:35:33 »
ls -1  |head - всетаки костыль. Лучше бы find
До написания GUI на yad остался 1 шаг  :D
+ за скорость освоения материала

Оффлайн totiks2012

  • Постоялец
  • ***
  • Сообщений: 173
  • Репутация: +4/-0
Re: Скрипт копирования (mv ; find)
« Ответ #12 : 13 Май 2017, 09:21:57 »
Ходил вчера на jabber.conf и добрые люди с codetaim подсказали вот такой код с использованием find
find ~/Музыка -print0 | xargs -0 -L5 echo | nl | while read d fs; do mkdir ~/$d; mv $fs ~/$d; doneно вчера забыл отсинхронизировать облако,и дома не смог проверить,на работе ща ставлю на win xp cygwin,(надеюсь шеф не оторвет мне яйца )),...если заметит) может получится на работе проверить...
« Последнее редактирование: 13 Май 2017, 09:40:54 от totiks2012 »

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 22124
  • Репутация: +164/-0
    • PuppyRus-A
Re: Скрипт копирования (mv ; find)
« Ответ #13 : 13 Май 2017, 09:25:23 »
ставлю на win xp cygwin
find и пр. здесь могут быть немного другие
Лучше виртуалка

Оффлайн totiks2012

  • Постоялец
  • ***
  • Сообщений: 173
  • Репутация: +4/-0
Re: Скрипт копирования (mv ; find)
« Ответ #14 : 19 Май 2017, 08:49:48 »
Продолжу здесь чтоб не плодить темы...
  Попытался применить этот скрипт в Pra, и оказалось что в Pra, bash находится в /usr/bin,а не в /bin, в скрипте попробовал указать на это но geany ругнулся на испорченый терминал ,запустив скрипт из терминала  терминал не видит файла,скорее всего у скрипта нет прав на исполнение, через пкм я попытался дать эти права скрипту,но ничего не изменилось,терминал упорно не видит скрипт, тут я начинаю понимать вред Gui, подскажите пожалуйста как запустить этот скрипт в Pra,
  так как наконец удалось запустить Pra на работе рядом с виндой,ну очень капризный комп попался , при загрузке флешки видеть не хочет,сидюка здесь нет,пришлось изощрится с загрузчиком винды...
« Последнее редактирование: 19 Май 2017, 09:40:19 от totiks2012 »