dlinyj: (Default)
[personal profile] dlinyj
Чой-то скучно, чой-то давно ничего не писал. Пока не буду писать холиварный пост Wndows vs Linux или Maemo vs Windows Mobile vs Android о своих впечатлениях об n900, т.к. они пока недостаточно сформированны. Скажу уклончиво - девайс сыроват.

http://img-fotki.yandex.ru/get/4405/dolin-s.6/0_5d60e_b31043cd_M.jpg

Намедни с торентов накачал уйму ромов для эмулятора DendyNES (special for [livejournal.com profile] cluster_d ). И там так много файлов, что эмулятор (для Maemo!) их индексирует несколько минут и листать их запаришься. По сему родилась задача - разложить их по папкам, согласно буквам алфавита.

Внимание вопрос: Как написать BASH-скрипт (или какой другой скрипт, питона к сожалению я не знаю), который бы: а) Создал папки от A до Z; б) разложил файлы согласно первой букве в имени файла в соответствующую папку (разумеется "А" и "а" кладётся в папочку "А"). Цифирные названия кладётся отдельно в отдельную папку.

Если есть любые идеи, с удовольствие выслушаю (можете даже меня направить гуглить по теме, тока не знаю что задавать в гугле).

Date: 2011-02-20 10:22 pm (UTC)
From: [identity profile] muchkaev.livejournal.com
есть такой скрипт - все руки никак не дойдут до его публикации

Date: 2011-02-20 10:31 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Есть повод ;). Ещё и дать описание.

Date: 2011-02-21 12:34 am (UTC)
From: [identity profile] dkill.livejournal.com
На гениальность не претендует, но должно делать то что должно.
дешево и сердито:

for c in $(echo {A..Z} {0..9}); do [ -d $c ] || mkdir $c; echo "Dir -> $c"; for f in /usr/share/pixmaps/*; do de=$(basename $f|tr [:lower:] [:upper:]); [ $(echo $de|egrep -q ^$c; echo $?) = 0 ] && echo " cp $f $c/ "; done; done

не забудь указать свою директорию заместо /usr/share/pixmaps/ (звездочку оставь), и убрать echo "" перед cp $f $c/

Date: 2011-02-21 02:39 am (UTC)
From: [identity profile] what-me.livejournal.com

mkdir ~/dendyfiles
cd ~/dendyfiles
perl -e 'mkdir for "1", A..Z'
find /path/to/dendy/torrents -type f |perl -nle 'm{/(.)[^/]+$} && system "cp $_ " . ($1 le "A" ? "1" : uc $1)'

Date: 2011-02-21 06:43 am (UTC)
From: [identity profile] dlinyj.livejournal.com
Задумался об изучении перла...

Date: 2011-02-21 07:58 am (UTC)
From: [identity profile] maddev.livejournal.com
Очень рекомендую. Что-нибудь распарсить, посчитать или исходник какой-нибудь таблички сгенерировать — самое то!

Date: 2011-02-21 10:16 pm (UTC)
From: [identity profile] levsha100.livejournal.com
Или питона.

Date: 2011-02-21 09:33 am (UTC)
From: [identity profile] aterentiev.livejournal.com
я б тебе виндовый батник напейсал, та ты ж линуксоид... :)

Date: 2011-02-21 09:39 am (UTC)
From: [identity profile] dlinyj.livejournal.com
Сей момент сижу под виндой. Я не линуксойд, я просто пользователь линукса.

Date: 2011-02-21 10:00 am (UTC)
From: [identity profile] aterentiev.livejournal.com
так тебе батч-скрипт тоже нужен? :) так бы и сказал :)

@echo off
setLocal EnableDelayedExpansion
for %%i in (*.*) do (
set filename=%%i
set letter=!filename:~0,1!
mkdir !letter! 2> nul
move %%i !letter!
)

Date: 2011-02-21 12:31 pm (UTC)
From: [identity profile] ollycat (from livejournal.com)
Ну вы блин даете... Для такой элементарной задачи перл вызывать! Причем ладно бы все на перле, а то ради одной мелочи какой-то. :) Хотя конечно на то он и unix way, что бы не один, но все пути вели к нужной цели. :)

В общем кидаю "свои 5 копеек". ;)

ls | while read I; do DIR=`echo $I | awk '{c=substr($1,1,1); print c}'`; mkdir -p $DIR ; cp "$I" $DIR/; done

Если нет русских имен или кодировка не utf-8, а какая-нибудь однобайтная, типа koi8-r, то можно еще короче:

ls | while read I; do DIR=`echo $I | cut -c1`; mkdir -p $DIR ; cp "$I" $DIR/; done

Если не хочется, что бы папки были разные для заглавных и маленьких букв, то будет так:

ls | while read I; do DIR=`echo $I | awk '{c=substr($1,1,1); print tolower(c)}'`; mkdir -p $DIR ; cp "$I" $DIR/; done

P.S. Но к тому, что перл изучить полезно - целиком и полностью присоединяюсь! Очень полезная вещь для обработки текстов.

UPD: О! Знакомый подсказал еще один вариант с грепом, почему-то я о нем не подумал сразу. :)

ls|while read I; do DIR=`echo $I | grep -Eo '^.'`; mkdir -p $DIR ; cp "$I" $DIR/; done

Date: 2011-03-08 06:43 pm (UTC)
From: [identity profile] strelnikovvv.livejournal.com
в чем сложности, хоть я и давно не админ, уж 3 года как...
#!/bin/bash
#мало ли чего у ваш штатно в sh?
for i in A..Z ; do
echo -n производим каталог имени $i,
mkdir $i
echo -n " далее переносим мусор с начальной буквой "$i
find . -iname $i* -type f -depth 1 -exec mv {} $i \;
echo ", пойдем дальше."
done

January 2026

S M T W T F S
    123
456 78910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 23rd, 2026 02:11 am
Powered by Dreamwidth Studios