LinuxForum.Fans
Тема

Сортировка файлов

Автор: 4fun 28 сообщений 7719 просмотров
#267001

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

#267002
"4fun" написал:
Необходимо написать простой скрипт.

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

#267003

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

#267004
"4fun" написал:
С помощью чего это вообще можно сделать?

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

#267016
Lupo Alberto написал:
[quote="4fun"]С помощью чего это вообще можно сделать?

в основном с помощью find и команд оболочки.
Я примерно так понял задачу: в директории имеются файлы, нужно создать каталоги и рассортировать по ним эти файлы. Где имя каталога — имя группы файлов с одинаковым именем, в каталоге — подкаталоги по расширениям.[/quote]
Главная директория - название файла, в которой 2 вложенные директрии, которые имеют одинаковое имя для всех, и в конечную директорию нужно определить файлы.
Find'om найду, а сортировать чем?

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

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

"4fun" написал:
Find'om найду, а сортировать чем?

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

text

find DIR -type f -name '*.txt' -exec cp {} DIR_1 \;
#267019

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

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

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

#267021
Lupo Alberto написал:
[quote="4fun"]Допустим, имеются файлы file1.bsp, file1.nav, file2.bsp.
file1.bsp, file1.nav мы определяем в /file1/dir1/dir2

По какому критерию создаются каталоги dir1/dir2?[/quote]
Они будут одинаковы для всех файлов. Т.е. /filename/cstrike/maps

#267022

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

#267024

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

text

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 поставить...

#267025
Fat-Zer написал:
тут find'ои геморройно будет... проще так:
text

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

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

#267026
"Fat-Zer" написал:
тут find'ои геморройно будет... проще так:

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

"Fat-Zer" написал:
wile read file

Опечатка:

text
while ...
#267027
text
#!/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

#267028
Lupo Alberto написал:
text
#!/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} куда?

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

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

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

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

#267030

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

#267031

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

#267032
"4fun" написал:
Спамится find: unknown predicate `-u'

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

text

cat -A sort.sh
#267035

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

Показать

[console]
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 %
[/console]
Войдите или зарегистрируйтесь, чтобы ответить.