2013-11-12 1 views
2

У меня есть 1000 файлов в каталоге, и я хочу, чтобы их можно разделить на подкаталоги, причем каждый подкаталог содержал определенное количество файлов. Меня не волнует, какие файлы входят в какие каталоги, до тех пор, пока каждый содержит определенный номер. Все имена файлов имеют общее окончание (например, .txt), но все, что происходит до этого, меняется.присвоение файлов в каталоге подкатегориям

Кто-нибудь знает простой способ сделать это.

+0

«Кто-нибудь знает, как легко это сделать». Может быть, вы могли бы поговорить о не очень-простом для начала? – devnull

+0

вручную mv определенное количество файлов в каждом подкаталоге было бы одним из самых простых способов сделать это. – user1308144

ответ

3

Если у вас есть только файлы, заканчивающиеся в *.txt, без скрытых файлов и нет каталогов:

#!/bin/bash 
shopt -s nullglob 

maxf=42 

files=(*.txt) 

for ((i=0;maxf*i<${#files[@]};++i)); do 
    s=subdir$i 
    mkdir -p "$s" 
    mv -t "$s" -- "${files[@]:i*maxf:maxf}" 
done 

Это создаст директорий subdirX с X целое число, начиная с 0, и поставит 42 файлов в каждом каталоге.

Вы можете настроить вещь, чтобы иметь мягкие нули для X:

#!/bin/bash 

shopt -s nullglob 

files=(*.txt) 
maxf=42 
((l=${#files[@]}/maxf)) 
p=${#l} 

for ((i=0;maxf*i<${#files[@]};++i)); do 
    printf -v s "subdir%0${p}d" "$i" 
    mkdir -p "$s" 
    mv -t "$s" -- "${files[@]:i*maxf:maxf}" 
done 
2
max_per_subdir=1000 
start=1 
while [ -e $(printf %03d $start) ]; do 
    start=$((start + 1)) 
done 
find -maxdepth 1 -type f ! -name '.*' -name '*.txt' -print0 \ 
| xargs -0 -n $max_per_subdir echo \ 
| while read -a files; do 
    subdir=$(printf %03d $start) 
    mkdir $subdir || exit 1 
    mv "${files[@]}" $subdir/ || exit 1 
    start=$((start + 1)) 
done 
+0

О, дорогая, это не работает для имен файлов, содержащих пробелы или забавные символы! –

+0

@gniourf_gniourf: Я знаю, что это не работает с пробелами, но какие смешные символы сломают его? –

+0

новые строки и вкладки или, в общем, все в 'IFS'. –

0

Как насчет

find *.txt -print0 | xargs -0 -n 100 | xargs -I {} echo cp {} '$(md5sum <<< "{}")' | sh 

Это позволит создать несколько каталогов каждый из которых содержит 100 файлов. Имя каждого созданного каталога представляет собой хеш md5 имен файлов, которые он содержит.

+0

Это не во многом с именами файлов, содержащими пробелы или смешные символы. –

+0

Да не предназначен для производства. Предназначен для решения «простой» части вопроса OP. – damienfrancois

Смежные вопросы