Большой Воронежский Форум
» UNIX и дериваты>Сортировка файлов на bash?
Hip-Hop 08:51 22.11.2011
Накалял простой скрипт для сортировки файлов.

Код:
video=./video
music=./music
docs=./doc
archive=./archive
scripts=./scripts

match()
{

file=$(echo $fn | awk -F/ '{print $NF}')

for i in `ls $1`
do
if [ "$i" != "$file" ]
then
continue
else
#echo "Файл существует"
continue 2
fi
done
}

mkdirs()
{
if [ -d $1 ]
then
echo
else
mkdir $1
fi
}


extn()
{
extn=$(echo $fn | awk -F/ '{print $NF}'| sed 's/[^.]*\.//')
echo $1/$extn
}

find . -name '*' | grep -v $0 | while read fn
do

case $fn in

*avi|*mkv|*flv|*vob|*mpg )
mkdirs $video
match $video
mv  $fn $video
;;

*mp3|*ogg )
mkdirs $music
match $music
mv  $fn $music
;;

*doc|*odt|*ods|*html|*htm|*chm|*djvu|*pdf )
mkdirs $(extn $docs)
match $docs
mv $fn $(extn $docs)
;;

*zip|*rar|*tar|*bz2|*gz|*tgz|*deb|*7z )
mkdirs $(extn $archive)
match $archive
mv $fn $(extn $archive)
;;

*pl|*py|*sh )
mkdirs $(extn $scripts)
match $scripts
mv $fn $(extn $scripts)
;;

* )
#echo "Ohh!"
esac
done
А как не разбирать папки со сборниками - альбомы музыки или кино по тематике? [Ответ]
Hip-Hop 11:24 22.11.2011
пост №1 плохо работает. Этот вариант уже лучше. Я тестирую с архивами и docs:

Код:
video=./video
music=./music
docs=./docs
archive=./archive
scripts=./scripts

match()
{

file=$(echo $fn | awk -F/ '{print $4}')

for i in `ls $1`
do
if [ "$i" != "$file" ]
then
continue
else
#echo "Файл существует"
continue 2
fi
done
}

mkdirs()
{
if [ -d $1 ]
then
sleep 0
else
mkdir $1
fi
}

extn()
{
extn=$(echo $fn | awk -F/ '{print $NF}'| sed -e 's/.*\.//;q')
echo $1/$extn
}

dirsp()
{
dirs=( video scripts music archive )
find . -type d -empty | grep -v ${dirs[@]}
}

#find -type d -



find . -name '*' | grep -v $0 | while read fn
do

case $fn in

*avi|*mkv|*flv|*vob|*mpg )
mkdirs $video
match $video
mv  $fn $video
;;

*mp3|*ogg )
mkdirs $music
match $music
mv  $fn $music
;;

*doc|*odt|*ods|*html|*htm|*chm|*djvu|*pdf )
mkdirs $docs
mkdirs $(extn $docs)
match  $(extn $docs)
mv "$fn" $(extn $docs)
;;

*zip|*rar|*tar|*bz2|*gz|*tgz|*deb|*7z )
mkdirs $archive
mkdirs $(extn $archive)
match  $(extn $archive)
mv "$fn"  $(extn $archive)
;;

*pl|*py|*sh )
mkdirs $(extn $scripts)
match $scripts
mv $fn $(extn $scripts)
;;

* )
#echo "Ohh!"
esac
done
Архивы и документы раскладываются в archive и docs соответс в pdf, djvu, tar, zip т.д [Ответ]
Катя. 18:26 22.11.2011
Кажется мне удалось найти отличную иллюстрацию к теме:

Сообщение от Hip-Hop:
Сортировка файлов на bash?



На первый вопрос ответ уже есть.
[Ответ]
Hip-Hop 19:00 22.11.2011
Катя., ну, бывают нужно? Сортируется даж с проблемами в именах и т.д. Практически не ругается при работе

Код:
export IFS=$'\x0A'

video=./video
music=./music
docs=./docs
archive=./archive
scripts=./scripts

match()
{

file=$(echo $fn | awk -F/ '{print $4}')

for i in `ls $1`
do
if [ "$i" != "$file" ]
then
continue
else
#echo "Файл существует"
continue 2
fi
done
}

mkdirs()
{
if [ -d $1 ]
then
sleep 0
else
mkdir $1
fi
}

extn()
{
extn=$(echo $fn | awk -F/ '{print $NF}'| sed -e 's/.*\.//;q')
echo $1/$extn
}

dirsp()
{
find . -type d -empty -exec rm -r '{}' \;
}




find . -name '*' | grep -v $0 | while read fn
do

case $fn in

*avi|*mkv|*flv|*vob|*mpg )
mkdirs $video
match $video
mv  $fn $video
;;

*mp3|*ogg )
mkdirs $music
match $music
mv  $fn $music
;;

*doc|*odt|*ods|*html|*htm|*chm|*djvu|*pdf )
mkdirs $docs
mkdirs $(extn $docs)
match  $(extn $docs)
mv $fn $(extn $docs) &>> /dev/null
dirsp
;;

*zip|*rar|*tar|*bz2|*gz|*tgz|*deb|*7z )
mkdirs $archive
mkdirs $(extn $archive)
match  $(extn $archive)
mv $fn $(extn $archive) &>> /dev/null
;;

*pl|*py|*sh )
mkdirs $scripts
mkdirs $(extn $scripts)
match $scripts
mv $fn $(extn $scripts)
;;

* )
#echo "Ohh!"
esac
done
[Ответ]
X0R 21:01 22.11.2011
Hip-Hop, портируй PowerShell [Ответ]
Hip-Hop 20:30 23.11.2011
X0R, зачем?

Код:
 
export IFS=$'\x0A'
#echo "<$IFS>" | od -bc

video=./video
music=./music
docs=./docs
archive=./archive
scripts=./scripts



mkdirs()
{
if [ -d $1 ]
then
sleep 0
else
mkdir $1
fi
}

extn()
{
extn=$(echo $fn | awk -F/ '{print $NF}'| sed -e 's/.*\.//;q')
echo $1/$extn
}

dirsp()
{
find . -depth -type d -empty -exec rm -r '{}' \;
}

 if [ -z $1 ]
then
  echo "ohh!"
elif  [ "$1" == "-d" ]
then
dirsp
fi
 
find . \( -path $video -o -path $music -o -path $archive -o -path $docs -o -path $scripts \) -prune -o -name '*'    | grep -v $0 | while read fn
do

case $fn in

*avi|*mkv|*flv|*vob|*mpg )
mkdirs $video
mv  $fn $video
;;

*mp3|*ogg )
mkdirs $music
mv  $fn $music
;;

*doc|*odt|*ods|*html|*htm|*chm|*djvu|*pdf )
mkdirs $docs
mkdirs $(extn $docs)
mv $fn $(extn $docs)
;;

*zip|*rar|*tar|*bz2|*gz|*tgz|*deb|*7z )
mkdirs $archive
mkdirs $(extn $archive)
mv $fn $(extn $archive)
;;

*pl|*py|*sh )
mkdirs $scripts
mkdirs $(extn $scripts)
mv $fn $(extn $scripts)
;;

* )
#echo "Ohh!"
esac
done
Вот эта конструкция помеченная красным.. не дает искать в папках в которые происходит сортировка если они (папки для сортировки) находятся там же где и поиск. Во-вторых, это только первый этап сортировки. Я ещё думал фильтровать имя архива на предмет принадлежности. [Ответ]
Hip-Hop 20:56 23.11.2011
X0R, powershell не ровня командным интерпретаторам unix.

Задачи:

1. Если это архив (tar, zip, rar и т.д) с музыкой, то его надо положить в /archive/rar/music ? Или сразу его разжимать и класть в misic в соотв с пунктом №2.

2. Если это папка с музыкой (mp3, ogg, flac и т.д) и она не имеет других папок с музыкой внутри себя. (как тут определить папку с альбомо?), положить её в /music/Автор/ ? Как определить автора альбома?
[Ответ]
Hip-Hop 03:57 24.11.2011
X0R, Нужно получить список всех файлов в архиве. Например, возьмём zip.

unzip -l :

Код:
Archive:  OpenSource012.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
  1493151  2006-10-03 12:09   OpenSource012_20061003.pdf
     3260  2006-10-03 22:55   OpenSource012-listings.txt
---------                     -------
  1496411                     2 files
Ужасный вывод, но это вы ещё не видили rar, а вот tar:

Код:
root@debian-1:~/testdir/scripts/sh# tar -tf vnstat_php_frontend-1.5.0.tar.gz 
vnstat_php_frontend-1.5.0/
vnstat_php_frontend-1.5.0/VeraBd.ttf
vnstat_php_frontend-1.5.0/README
vnstat_php_frontend-1.5.0/COPYING
vnstat_php_frontend-1.5.0/themes/
vnstat_php_frontend-1.5.0/themes/light/
vnstat_php_frontend-1.5.0/themes/light/theme.php
vnstat_php_frontend-1.5.0/themes/light/style.css
vnstat_php_frontend-1.5.0/themes/red/
vnstat_php_frontend-1.5.0/themes/red/theme.php
vnstat_php_frontend-1.5.0/themes/red/style.css
vnstat_php_frontend-1.5.0/themes/dark/
vnstat_php_frontend-1.5.0/themes/dark/theme.php
vnstat_php_frontend-1.5.0/themes/dark/style.css
vnstat_php_frontend-1.5.0/themes/espresso/
vnstat_php_frontend-1.5.0/themes/espresso/theme.php
vnstat_php_frontend-1.5.0/themes/espresso/style.css
....



X0R, Короче, надо получить список содер архива в переменную. Как это сделать в powershell? Я делаю это так (не оптимальный вариан):
Код:
a=`unzip -l $1 | wc -l` # все строки
c=`unzip -z $1 | wc -l`# комменты? 
let "c=c+2" # const? 
let "a=a-1" # const? 
b=`unzip -l $1 | awk '(NR > c ) && (NR < a) {print $4}' a=$a c=$c`# все кроме шапки и двух последних строк. 
echo "$b"
Но есть маленькое НО, дурачки которые ставят пробелы в именах файлов.
[Ответ]
Hip-Hop 04:33 24.11.2011
X0R, Парень написал книжку по freebsd и наставел пробелов. -] Он ещё и исполняемый. Наверное под виндой делал. -]

[Ответ]
Hip-Hop 05:03 24.11.2011
X0R, Кстати, чтобы переименовывать такие опусы.. можно использовать такую констр запуская в папке с опусами:

ls -1 | awk '{ newfn = $0; if(gsub(" ", "_", newfn)>0) { system("mv \"" $0 "\" " newfn) } }' [Ответ]
Hip-Hop 10:39 25.11.2011
X0R, и я решил переделывать rar'ы и zip'ы в тары и дописывать чёрточки, а потом работать дальше с tar. У меня получилось пока так:

Код:
export IFS=$'\x0A'
#echo "<$IFS>" | od -bc

video=./video
music=./music
docs=./docs
archive=./archive
scripts=./scripts



mkdirs()
{
if [ -d $1 ]
then
sleep 0
else
mkdir $1
fi
}

extn()
{
extn=$(echo $fn | awk -F/ '{print $NF}'| sed -e 's/.*\.//;q')
echo $1/$extn
}

dirsp()
{
find . -depth -type d -empty -exec rm -r '{}' \;
}

 if [ -z $1 ]
then
  echo "ohh!"
elif  [ "$1" == "-d" ]
then
dirsp
fi

find . \( -path $video -o -path $music -o -path $archive -o -path $docs -o -path $scripts \) -prune -o -name '*' | grep -v $0 | grep -v rar_zip2tar.sh |  while read fn
do

case $fn in

*avi|*mkv|*flv|*vob|*mpg )
mkdirs $video
mv  $fn $video
;;

*mp3|*ogg )
mkdirs $music
mv  $fn $music
;;

*doc|*odt|*ods|*html|*htm|*chm|*djvu|*pdf )
mkdirs $docs
mkdirs $(extn $docs)
mv $fn $(extn $docs)
;;

*zip|*rar|*tar|*bz2|*gz|*tgz|*deb|*7z )
mkdirs $archive
mkdirs $(extn $archive)
mv $fn $(extn $archive)

a=`extn`
if [[ a == rar||zip ]]
then
. rar_zip2tar.sh # просто как пример. :) 
fi
;;

*pl|*py|*sh )
mkdirs $scripts
mkdirs $(extn $scripts)
mv $fn $(extn $scripts)
;;

* )
#echo "Ohh!"
esac
done
Код:
export IFS=$'\x0A'
#echo "<$IFS>" | od -bc
#shopt -s extglob && rm -rf !(*tar) ??
#rm -r `ls -1 | grep -v *sh | grep -v *rar`

#root_id=0
#if [ $UID -eq $root_id ]
#then
#echo; echo -e "НЕ запускайте от  root этот скрипт!";  echo
#exit 0
#fi




mount |grep mnt; echo $?
if [ $? -ne 0 ]
then
mount -t tmpfs /dev/shm /mnt/
fi

mkdirs()
{
if [ -d $1 ]
then
sleep 0
else
mkdir $1
fi
}

0x5F()
{
ls -1  | awk '{ newfn = $0; if(gsub(" ", "_", newfn)>0) { system("mv \"" $0 "\" " newfn) } }'
}

file()
{
file=`echo $fn | echo $1 | awk -F/ '{print $NF}' |  sed 's/.rar//g'`
}

extn()
{
extn=$(echo $fn | awk -F/ '{print $NF}'| sed -e 's/.*\.//;q')
echo $extn
}

rar=/mnt/rar
cok=/mnt/cok
tar=/mnt/tar

mkdirs $rar
mkdirs $tar
mkdirs $cok

cp -R /root/testdir/archive/rar/* $rar
cp -R /root/testsir/archive/zip/* $rar

cd $rar && 0x5F $rar

find $rar -type f -name '*' | while read fn
do
a=`extn`
if [ $a == "rar" ]
then
unrar x -inul $fn $cok
cd $cok && 0x5F $cok/*
file "$fn"
cd $cok && tar -caf  $file.tar.gz .
mv $file.tar.gz $tar
rm -rf $cok/*
elif [ $a == "zip" ]
then
unzip $fn -d $cok
cd $cok && $0x5F $cok/*
file "$fn"
cd $cok && tar -caf $file.tar.gz .
mv $file.tar.gz $tar
rm -rf $cok/*
fi
done

exit 0
[Ответ]
dm.tsvetkov 15:18 25.11.2011
я бы хотел повторить катин вопрос.
его вторую часть - "зачем?" [Ответ]
Hip-Hop 18:11 25.11.2011

Сообщение от dm.tsvetkov:
"зачем?"

Я адепт http://ru.wikipedia.org/wiki/Рыбалка_со_спутника Это интересней.. чем тупо качать с торрентов. [Ответ]
mishel13 22:20 25.11.2011

Сообщение от Hip-Hop:
Я адепт http://ru.wikipedia.org/wiki/Рыбалка_со_спутника

с какого спутника ловишь? [Ответ]
dm.tsvetkov 09:23 26.11.2011
"Это интересней.. чем тупо качать с торрентов."

но, ведь не удобнее же. какой смысл? или ты думаешь, что весть этот "космический" контент не с торрентов берется? струнами генерируется? [Ответ]
Hip-Hop 09:27 26.11.2011

Сообщение от mishel13:
с какого спутника ловишь?

с разных.

Сообщение от dm.tsvetkov:
но, ведь не удобнее же. какой смысл?

Интересно? Должен же быть какой-то интерес? Тут тебе.. вдруг.. вкусная 'рыба' упадёт. Ты будешь рад этому!

Я давно уже посмотрел все фильмы которые хотел посмотреть. [Ответ]
X0R 12:26 26.11.2011

Сообщение от Hip-Hop:
надо получить список содер архива в переменную. Как это сделать в powershell?

Код:
$list = 7z l archiv.zip
$z = for ($i=13; $i -le $list.Length - 3; $i++) { [System.IO.Path]::GetFileName($list[$i]) }

Сообщение от Hip-Hop:
powershell не ровня командным интерпретаторам unix.

сравнил х с пальцем? [Ответ]
dm.tsvetkov 14:54 26.11.2011

Сообщение от Hip-Hop:
Должен же быть какой-то интерес?

к сожалению, не могу найти картинку.
на ней изображена стена. на стене розетка. к розетке подключена электроплитка. на электроплитке стоит кипящий чайник. из носика бьет струя пара, которая вращает вентилятор.
вентилятор привод в движение ротор генератора. к клемамам генратора подключена лампочка.
она светится!!! [Ответ]
Hip-Hop 15:18 26.11.2011
X0R, си шарп использовать нельзя.

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

Нет, я не понял. Вы о чем-то другом. Можно сортировать и торренты. Моя идея проста. Во-первых, хорошо оперировать архивами. Почему? Если ты скачал музыкальный альбом архивом.. ты можешь заглянуть в него? Найти там музыкальное расширение и положить этот архив - распоковав в 'музыка' Во-вторых, это могут быть теги? Любая текстовая информация которая сопутств файлу - метаданны? В-третьих, можно просто создавать словари совпадений. [Ответ]
X0R 15:53 26.11.2011

Сообщение от Hip-Hop:
си шарп использовать нельзя.

это PowerShell вообще то. В C# написать

Сообщение от :
7z l archiv.zip

нельзя, нужно через Process.Start() [Ответ]
Hip-Hop 15:53 26.11.2011
X0R, кстати, я просто не знал. есть программа zipinfo http://www.info-zip.org/ И список мы получим a=`zipinfo -1 $b`



есть rarinfo??
[Ответ]
Hip-Hop 15:55 26.11.2011

Сообщение от X0R:
{ [System.IO.Path]::GetFileName($list[$i]) }

А это тоже powershell? [Ответ]
X0R 16:23 26.11.2011

Сообщение от Hip-Hop:
А это тоже powershell?

а почему нет?

Сообщение от :
Windows PowerShell построен на базе Microsoft .NET Framework и интегрирован с ним. Дополнительно PowerShell предоставляет удобный доступ к COM, WMI и ADSI, равно как и позволяет выполнять обычные команды командной строки, чтобы создать единое окружение, в котором администраторы смогли бы выполнять различные задачи на локальных и удалённых системах.


Изображения
Нажмите на изображение для увеличения
Название: sshot-1.png
Просмотров: 7
Размер:	25.0 Кб
ID:	1607117  
[Ответ]
silly 16:34 26.11.2011
Почему никто не хочет пользоваться специально сделанными для вызова 7z из других программ ключами? И нормальными инструментами тоже?

Код:
`7z l -slt archive.zip`.lines.map{|line| line.start_with?('Path') ? line.split('=')[1].strip : nil}.compact
[Ответ]
X0R 16:35 26.11.2011
Hip-Hop, вот смори, каждую неделю приходит много архивов, нужно их распаковать, выбрать нужные данные и превратить в документы офиса пригодные для печати и редактирования, я работаю с офисом так:

Сообщение от :
$sAppProgID = “Word.Application”;
$tWordObj = [System.Type]::GetTypeFromProgID($sAppProgID)
$oWord = [System.Activator]::CreateInstance($tWordObj)
$oWord.Visible = $true
$oDocuments = $oWord.Documents
$docType = [Microsoft.Office.Interop.Word.WdDocumentType]::wdTypeDocument
$docFormat = [Microsoft.Office.Interop.Word.WdSaveFormat]::wdFormatDocument97
...

[Ответ]
Hip-Hop 16:36 26.11.2011
X0R, да, unrar тоже умеет выводить в нужной форме - без всякой фигни.



Вот, ман'ы надо читать.
[Ответ]
Hip-Hop 16:52 26.11.2011
silly, надо использовать богатый мир маленьких unix программ.



даже каких-то два unrar'а

а вот unrar-free так не умеет - unrar-nonfree lb *.rar
[Ответ]
Hip-Hop 17:42 26.11.2011
silly, просто, imho, сидя на unix не вижу смысла использовать спец языки программирования для каких-то внутр системных задач, когда достаточно средств системной оболочки и программа до кучи с схожей функ библиотек высокоур языков программирования. А то да.. можно и linux на python переписать или на javascript. [Ответ]
dm.tsvetkov 18:37 26.11.2011

Сообщение от Hip-Hop:
Нет, я не понял. Вы о чем-то другом. Можно сортировать и торренты. Моя идея проста. Во-первых, хорошо опер...

илья, я искренне восхищен этим твоим риторическим приемом.
к сожалению, не ты его придумал, но применяешь ты его - виртуозно.
ты прекрасно понял мою иронию, но прикинулся умным дураком.
"дураком", потому, что сделал вид, что не понимаешь насмешки, а умным - потому что с самым серьезным видом начал мне объяснять вещи, находящиеся за пределами моего понимания.

я всего лишь хотел сказать, что файлы, которые ты поймал - файлы с торрентов.
смысла плодить эту сущность, а еще и писать скрипты по рассортировки - 0.

ну, хотя моя параноя подсказывает мне одно преимущество этого золотокопания. [Ответ]
Вверх