1 (29.07.2012 21:18:02 отредактировано 4fun)

Здравствуйте. Необходимо написать простой скрипт.
Суть заключается в следующем: имеем директорию с файлами, есть группы файлов, которые имеют одинаковое имя, но разные расширения (*.bsp, *.nav, *.res, *.txt), но есть и такие файлы, которые лежат в одном экземпляре. Необходимо рассортировать эти файлы по именам в папки /filename/dir1/dir2. Заранее благодарен.

2

4fun пишет:

Необходимо написать простой скрипт.

«Необходимо» следует понимать «я готов заплатить» или «я пытаюсь написать скрипт, но у меня не получается»?
В первом случае — нужно создавать темы в соответствующем разделе;
во втором — что именно вы пытались сделать и что не получилось?

Был, был и весь вышел...

3

Скорее второй вариант. Я не могу понять, в какую сторону мне копать. С помощью чего это вообще можно сделать?

4

4fun пишет:

С помощью чего это вообще можно сделать?

в основном с помощью find и команд оболочки.
Я примерно так понял задачу: в директории имеются файлы, нужно создать каталоги и рассортировать по ним эти файлы. Где имя каталога — имя группы файлов с одинаковым именем, в каталоге — подкаталоги по расширениям.

Был, был и весь вышел...

5 (29.07.2012 22:25:16 отредактировано 4fun)

Lupo Alberto пишет:
4fun пишет:

С помощью чего это вообще можно сделать?

в основном с помощью find и команд оболочки.
Я примерно так понял задачу: в директории имеются файлы, нужно создать каталоги и рассортировать по ним эти файлы. Где имя каталога — имя группы файлов с одинаковым именем, в каталоге — подкаталоги по расширениям.

Главная директория - название файла, в которой 2 вложенные директрии, которые имеют одинаковое имя для всех, и в конечную директорию нужно определить файлы.
Find'om найду, а сортировать чем?

6

4fun пишет:

Главная директория - название файла, в которой 2 вложенные директрии, которые имеют одинаковое имя для всех, и в конечную директорию нужно определить файлы.

Всё равно не понятно ac объясните «на пальцах», дайте пример.

4fun пишет:

Find'om найду, а сортировать чем?

find имеет опцию -exec, которая может запустить нужную команду для найденных файлов.
Например, найти в директории DIR файлы с расширением .txt и скопировать в директорию DIR_1

find DIR -type f -name '*.txt' -exec cp {} DIR_1 \;
Был, был и весь вышел...

7 (29.07.2012 22:35:31 отредактировано 4fun)

Допустим, имеются файлы file1.bsp, file1.nav, file2.bsp.
file1.bsp, file1.nav мы определяем в /file1/dir1/dir2
file2.bsp определяем в /file2/dir1/dir2

8

4fun пишет:

Допустим, имеются файлы file1.bsp, file1.nav, file2.bsp.
file1.bsp, file1.nav мы определяем в /file1/dir1/dir2

По какому критерию создаются каталоги dir1/dir2?

Был, был и весь вышел...

9

Lupo Alberto пишет:
4fun пишет:

Допустим, имеются файлы file1.bsp, file1.nav, file2.bsp.
file1.bsp, file1.nav мы определяем в /file1/dir1/dir2

По какому критерию создаются каталоги dir1/dir2?

Они будут одинаковы для всех файлов. Т.е. /filename/cstrike/maps

10

О find почитал, но так и не понял, как задать нужное мне имя папки, которое должно совпадать с именем файла

11

тут find'ои геморройно будет... проще так:

ls | sed -r 's/(.*)\..*/\1/' | sort -u | while read file; do
    mkdir -p $file/dir1/dir2;
    mv $file.{bsp,nav} $file/dir1/dir2
done

ну или вместо ls можно find поставить...

95% процентов проблем находятся между клавиатурой и стулом.

12

Fat-Zer пишет:

тут find'ои геморройно будет... проще так:

ls | sed -r 's/(.*)\..*/\1/' | sort -u | wile read file; do
    mkdir -p $file/dir1/dir2;
    mv $file.{bsp,nav} $file/dir1/dir2
done

Спасибо, сейчас попробую

13

Fat-Zer пишет:

тут find'ои геморройно будет... проще так:

Если будут вложенные каталоги, ls не справится bx

Fat-Zer пишет:

wile read file

Опечатка:

while ...
Был, был и весь вышел...

14

#!/bin/bash
# В качестве директории поиска скрипту передаётся первый аргумент, вторым аргументом передаётся директория назначения.
SRC_DIR=${1}
DST_DIR=${2}

find ${SRC_DIR} -type f -exec basename "{}" \;  |  sed -r 's/(.*)\..*/\1/' | sort -u | \
while read UNIQ_NAME;
do 
   mkdir -p "${DST_DIR}/${UNIQ_NAME}/cstrike/maps";
   find ${SRC_DIR} -type f -name "${UNIQ_NAME}.*" -exec mv {} "${DST_DIR}/${UNIQ_NAME}/cstrike/maps" \;
done
Был, был и весь вышел...

15

Lupo Alberto пишет:
#!/bin/bash
# В качестве директории поиска скрипту передаётся первый аргумент, вторым аргументом передаётся директория назначения.
SRC_DIR=${1}
DST_DIR=${2}

find ${SRC_DIR} -type f -exec basename "{}" \;  |  sed -r 's/(.*)\..*/\1/' | sort -u | \
while read UNIQ_NAME;
do 
   mkdir -p "${DST_DIR}/${UNIQ_NAME}/cstrike/maps";
   find ${SRC_DIR} -type f -name "${UNIQ_NAME}.*" -exec mv {} "${DST_DIR}/${UNIQ_NAME}/cstrike/maps" \;
done

SRC_DIR=${1}
DST_DIR=${2}
То есть вместо ${1} я пишу откуда нужно читать файлы, а вместо ${2} куда?

16

4fun пишет:

То есть вместо ${1} я пишу откуда нужно читать файлы, а вместо ${2} куда?

./sort.sh /tmp/test /tmp/new

Изначально файлы расположены в /tmp/test, после сортировки в /tmp/new создастся структура каталогов.

P.S. В bash
${1} — первый аргумент команды;
${2} — второй аргумент команды...
То есть в контексте этого скрипта: присвоить переменной SRC_DIR значение перовго аргумента, DST_DIR — второго...

Был, был и весь вышел...

17

Спасибо. Сейчас файлы на сервер долью и проверю.

18

Спамится find: unknown predicate `-u'

19

4fun пишет:

Спамится find: unknown predicate `-u'

Как и чем копировали и сохраняли?
Покажите

cat -A sort.sh
Был, был и весь вышел...

20

Я «жестоко» не тестировал, но вроде бы работает:

+ открыть спойлер

 Консоль:

lupo@gentoo-laptop /tmp % ls -lR /tmp/test                                                                            [gentoo-laptop][23:35]
/tmp/test:
итого 1452
-rw-r--r-- 1 lupo lupo 636015 Апр 25 08:25 funtoo.jpg
-rw-r--r-- 1 lupo lupo 636015 Апр 25 08:25 funtoo.png
-rw-r--r-- 1 lupo lupo  47058 Май 23 09:38 Net Example 1.txt
-rw-r--r-- 1 lupo lupo 133873 Июн 25 23:43 slim.jpg
drwxr-xr-x 2 lupo lupo    100 Июл 29 23:34 test1/
drwxr-xr-x 2 lupo lupo     80 Июл 29 23:35 tmp/
-rw-r--r-- 1 lupo lupo  21124 Сен 18  2011 Troll.jpg

/tmp/test/test1:
итого 108
-rw-r--r-- 1 lupo lupo  9111 Дек  4  2011 funtoologooutline.png
-rw-r--r-- 1 lupo lupo 47058 Май 23 09:38 net.example.txt
-rw-r--r-- 1 lupo lupo 47058 Май 23 09:38 Net Example.txt

/tmp/test/tmp:
итого 156
-rw-r--r-- 1 lupo lupo 133873 Июн 25 23:43 slim.png
-rw-r--r-- 1 lupo lupo  21124 Сен 18  2011 Troll.png
lupo@gentoo-laptop /tmp % ./sort.sh /tmp/test /tmp/new                                                                [gentoo-laptop][23:35]
lupo@gentoo-laptop /tmp % ls -lR /tmp/test                                                                            [gentoo-laptop][23:36]
/tmp/test:
итого 0
drwxr-xr-x 2 lupo lupo 40 Июл 29 23:36 test1/
drwxr-xr-x 2 lupo lupo 40 Июл 29 23:36 tmp/

/tmp/test/test1:
итого 0

/tmp/test/tmp:
итого 0
lupo@gentoo-laptop /tmp % ls -lR /tmp/new                                                                             [gentoo-laptop][23:36]
/tmp/new:
итого 0
drwxr-xr-x 3 lupo lupo 60 Июл 29 23:36 funtoo/
drwxr-xr-x 3 lupo lupo 60 Июл 29 23:36 funtoologooutline/
drwxr-xr-x 3 lupo lupo 60 Июл 29 23:36 net.example/
drwxr-xr-x 3 lupo lupo 60 Июл 29 23:36 Net Example/
drwxr-xr-x 3 lupo lupo 60 Июл 29 23:36 Net Example 1/
drwxr-xr-x 3 lupo lupo 60 Июл 29 23:36 slim/
drwxr-xr-x 3 lupo lupo 60 Июл 29 23:36 Troll/

/tmp/new/funtoo:
итого 0
drwxr-xr-x 3 lupo lupo 60 Июл 29 23:36 cstrike/

/tmp/new/funtoo/cstrike:
итого 0
drwxr-xr-x 2 lupo lupo 80 Июл 29 23:36 maps/

/tmp/new/funtoo/cstrike/maps:
итого 1248
-rw-r--r-- 1 lupo lupo 636015 Апр 25 08:25 funtoo.jpg
-rw-r--r-- 1 lupo lupo 636015 Апр 25 08:25 funtoo.png

/tmp/new/funtoologooutline:
итого 0
drwxr-xr-x 3 lupo lupo 60 Июл 29 23:36 cstrike/

/tmp/new/funtoologooutline/cstrike:
итого 0
drwxr-xr-x 2 lupo lupo 60 Июл 29 23:36 maps/

/tmp/new/funtoologooutline/cstrike/maps:
итого 12
-rw-r--r-- 1 lupo lupo 9111 Дек  4  2011 funtoologooutline.png

/tmp/new/net.example:
итого 0
drwxr-xr-x 3 lupo lupo 60 Июл 29 23:36 cstrike/

/tmp/new/net.example/cstrike:
итого 0
drwxr-xr-x 2 lupo lupo 60 Июл 29 23:36 maps/

/tmp/new/net.example/cstrike/maps:
итого 48
-rw-r--r-- 1 lupo lupo 47058 Май 23 09:38 net.example.txt

/tmp/new/Net Example:
итого 0
drwxr-xr-x 3 lupo lupo 60 Июл 29 23:36 cstrike/

/tmp/new/Net Example/cstrike:
итого 0
drwxr-xr-x 2 lupo lupo 60 Июл 29 23:36 maps/

/tmp/new/Net Example/cstrike/maps:
итого 48
-rw-r--r-- 1 lupo lupo 47058 Май 23 09:38 Net Example.txt

/tmp/new/Net Example 1:
итого 0
drwxr-xr-x 3 lupo lupo 60 Июл 29 23:36 cstrike/

/tmp/new/Net Example 1/cstrike:
итого 0
drwxr-xr-x 2 lupo lupo 60 Июл 29 23:36 maps/

/tmp/new/Net Example 1/cstrike/maps:
итого 48
-rw-r--r-- 1 lupo lupo 47058 Май 23 09:38 Net Example 1.txt

/tmp/new/slim:
итого 0
drwxr-xr-x 3 lupo lupo 60 Июл 29 23:36 cstrike/

/tmp/new/slim/cstrike:
итого 0
drwxr-xr-x 2 lupo lupo 80 Июл 29 23:36 maps/

/tmp/new/slim/cstrike/maps:
итого 264
-rw-r--r-- 1 lupo lupo 133873 Июн 25 23:43 slim.jpg
-rw-r--r-- 1 lupo lupo 133873 Июн 25 23:43 slim.png

/tmp/new/Troll:
итого 0
drwxr-xr-x 3 lupo lupo 60 Июл 29 23:36 cstrike/

/tmp/new/Troll/cstrike:
итого 0
drwxr-xr-x 2 lupo lupo 80 Июл 29 23:36 maps/

/tmp/new/Troll/cstrike/maps:
итого 48
-rw-r--r-- 1 lupo lupo 21124 Сен 18  2011 Troll.jpg
-rw-r--r-- 1 lupo lupo 21124 Сен 18  2011 Troll.png
lupo@gentoo-laptop /tmp %

Был, был и весь вышел...

21 (30.07.2012 02:38:10 отредактировано 4fun)

 Консоль:
# cat -A sort
#!/bin/bash$
SRC_DIR=${1}$
DST_DIR=${2}$
$
find ${SRC_DIR} -type f -exec basename "{}" \;  |  sed -r 's/(.*)\..*/\1/' | sort -u | \$
while read UNIQ_NAME;$
do $
mkdir -p "${DST_DIR}/${UNIQ_NAME}/cstrike/maps";$
find ${SRC_DIR} -type f -name "${UNIQ_NAME}.*" -exec mv {} "${DST_DIR}/${UNIQ_NAME}/cstrike/maps" \;$
done

Как и чем копировали и сохраняли?

С помощью мыши и mcedit ab Так не нужно было делать?

22

4fun пишет:

done

в конце нет конца строки - редактор ваш туповат, надо самому поставить...
${SRC_DIR} в обоих случаях должно быть в кавычках... если в пути есть пробелы работать не будет....

Lupo Alberto, ох и намудрил...

95% процентов проблем находятся между клавиатурой и стулом.

23

Fat-Zer пишет:

${SRC_DIR} в обоих случаях должно быть в кавычках...

То есть мне писать ./sort '/tmp/src' '/tmp/new' ?
Просто не рискую, пока что, запускать, т.к. вчера моя попытка повесила сервер и пришлось ребутить
А в чем конкретно могла быть причина unknown predicate `-u' ?

24

4fun пишет:

То есть мне писать ./sort '/tmp/src' '/tmp/new' ?

Кавычки, НО двойные, нужно добавить в скрипт.

4fun пишет:

А в чем конкретно могла быть причина unknown predicate `-u' ?

Возможно:

Fat-Zer пишет:

в конце нет конца строки - редактор ваш туповат, надо самому поставить...

4fun пишет:

Просто не рискую, пока что, запускать, т.к. вчера моя попытка повесила сервер и пришлось ребутить

Lupo Alberto пишет:

Я «жестоко» не тестировал, но вроде бы работает:

Попробуйте создать на домашнем компьютере подобную структуру каталогов и файлов и проверьте.

Был, был и весь вышел...

25

Lupo Alberto пишет:

Попробуйте создать на домашнем компьютере подобную структуру каталогов и файлов и проверьте.

На домашнем винда, а линя только на сервах. Ближе к ночи попробую, дабы не мешать никому.

26

4fun пишет:

То есть мне писать ./sort '/tmp/src' '/tmp/new' ?

нет, в самом скрипте... и в двойных кавычках
ABS к прочтению или хотя бы к просмотру....

4fun пишет:

А в чем конкретно могла быть причина unknown predicate `-u' ?

в SRC_DIR был путь с пробелами....

95% процентов проблем находятся между клавиатурой и стулом.

27

4fun пишет:

Ближе к ночи попробую, дабы не мешать никому.

В качестве некоторой перестраховки можно поменять команду mv на cp (если место на сервере позволяет). Если всё сработает нормально, каталог-источник можно будет затем удалить.

Был, был и весь вышел...

28

Скрипт отработал на ура. А проблема была в том, что не стоило скрипт называть sort. Переименовал и все заработало. Огромное спасибо за помощь ab