LINUX.ORG.RU

bash-скрипт для сбора файлов после восстановления данных

 ,


0

2

Я случайно грохнул данные на внешнем hdd. Почти 4 суток шло восстановление файлов через r-studio. Каким-то образом с раздела в 930 Гб он умудрился восстановить 1,11 Тб, и так и не закончил восстановление. Уже остановил вручную.

В общем, сейчас восстановлено несколько тысяч папок, в которых раскидано (по большей части без сохранения структуры) более 500 тысяч файлов. Жуткая мешанина, которую придётся ещё разгребать.

Сколько файлов может быть в одной папке, чтоб их можно было нормально просматривать? В ubuntu 15.04, если не будет глючить в винде - тоже хорошо.

В общем, хочу попросить гуру bash-скриптинга. Нужен скрипт, который раскидает все файлы по папкам с названием расширения (.jpg в папку jpg), причём список расширений надо получить из самих файлов - там есть и .jpg/.jpeg, .doc, .docx, .rtf и много других. Я думаю, что по 10к файлов в одну папку будет достаточно, т.е. как-только наберётся 10к файлов в папке jpg, надо создать папку jpg1, потом jpg2 и так по всем типам файлов. Я так понимаю, маска должна быть что-то вроде *.{3-4 символа}, поскольку более длинные расширения встречаются редко (не знаю, есть ли они вообще там).

То есть скрипт должен найти файлы с нужным расширением и переместить их в отдельную папку wd, в которой нужно разместить папки с названиями расширений. Как-то так.

Вся проблема в том, что очень много пустых папок, или папок, в которых лежит 1 файл. Часто файлы дублируются, поэтому в случае коллизий надо добавить к новому файлу нумерацию (1), (2) и т.д.

★★★★

причём список расширений надо получить из самих файлов - там есть и .jpg/.jpeg, .doc, .docx, .rtf и много других.

Думаю, сначало нужно получить список расширий, обработать его руками — каждой группе расширений определить каталог, куда помещать файл.

Такая вот команда выведет список расширений файлов, если, конечно, сортировка потянет такое кол-во имён файлов:

find КАТАЛОГ_С_ФАЙЛАМИ -type f -printf '%f\n' | sed -n 's/.*\(\...*\)/\1/p' | uniq | sort | uniq

Вся проблема в том, что очень много пустых папок,

Папки в винде, а пустые каталоги удаляются командой:

find КАТАЛОГ_С_ФАЙЛАМИ  -type d -empty -delete

Я вижу проблему в другом, что, так как файлов много, запускать для каждого файла команду mv слишком расточительно, нужно через xargs, сейчас попробую что-то накорябать.

mky ★★★★★
()
Ответ на: комментарий от mky

Вот какой-то такой скрипт родился:

#!/bin/bash

OUTDIR="TXT"
NFILES=10000


NARGS=50
NN=$(( NFILES / NARGS ))

mkdir $OUTDIR || exit 1
ln -s -T $OUTDIR OUT

k=0; n=0

find КАТАЛОГ_С_ФАЙЛАМИ -type f -iname '*.txt' -print0 |\
 xargs -0 -t -n $NARGS mv --backup=numbered -t OUT  2>&1 |\
  while read A ; do
    k=$((k+1))
    if [ $k -gt $NN ] ; then
        k=0;
        n=$((n+1))
        O=$OUTDIR$n
        mkdir $O || exit1
        ln -s -T $O OUT.tmp
        mv -T -f OUT.tmp OUT
    fi
  done

rm -f OUT

В OUTDIR задаётся каталог куда складывать файлы, дополнительные каталоги создаются автоматически, но нарезка не ровно по 10000 файлов, а примерно. В команде find задаётся каталог откуда брать файлы и маска (можно несколько масок, думаю, примеры нагуглите). Главное, чтобы OUTDIR не являлся подкаталогом исходного каталога, откуда перемещаются файлы. Создаются временные символьные ссылки ″OUT″ и ″OUT.tmp″.

Файлы с одинаковыми именами будут получать имена: name.txt.~1~, name.txt.~2~ и т.д. Потом можно будет переименовать их в name.~1~.txt, name.~2~.txt с помощью команды rename.

mky ★★★★★
()
Ответ на: комментарий от mky

Хм. А научить его разбирать расширения самому нельзя? Там просто целая куча расширений. Хотелось бы запустить скрипт и оставить его на часик-другой, пока он всё сделает.

ekzotech ★★★★
() автор топика
Ответ на: комментарий от ekzotech

Если ты хочешь готовое решение, то тебе в платный раздел форума jobs надо. здесь тебе дали достаточно материала для самостоятельной работы

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.