поместите тысячи файлов в отдельные папки, основываясь на их части имени - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть каталог, содержащий более 100 000 файлов, с именем вроде:

1_jpeg.ext
1_png.ext
2_jpeg.ext
2_png.ext
...
101.235_jpeg.ext
101.236_jpeg.ext

И мне нужно взять все эти файлы и поместить их в отдельные папки, например:

jpeg_folder
   ---001000
   ---002000
   ---003000
   ---...
png_folder
    ---001000
    ---002000
    ---003000
    ---...

Я хочу разделить эти файлы на папки, каждая из которых содержит ровно 1000 изображений.

Важно, как они сортируются, например, папка, созданная в папке jpeg с именем 001000, будет иметь такие файлы:

1_jpeg.ext  
2_jpeg.ext
...

Я работаю на машине с Ubuntu 16.04.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Мы можем использовать sort и split для группировки.

Так как в Ubuntu есть утилиты GNU, мы можем использовать специфичные для GNU опции split, чтобы напрямую генерировать подходящие имена.

#/bin/bash

# somewhere to store the intermediate information
mkdir tmp 

# create list of files to move (dot prefix so "ls *" ignores it)
find -maxdepth 1 -mindepth 1 -type f | sort -n > tmp/.files   

for ext in _jpeg.ext _png.ext; do
    # top-level output directory names
    type="$(basename "$ext" .ext)_folder"

    # chunk each type of image into groups of (up to) 1000 files
    grep "$ext\$" <tmp/.files |\
    split --numeric-suffixes=1 -a3 -l1000 - tmp/

    # use split's output filenames as basis for new directories
    # then move each group of files. tidy up as we go
    for grp in tmp/*; do
        dir="$type/$(basename $grp)000"
        mkdir -p "$dir"
        cat "$grp" | xargs mv -t $dir/.
        rm "$grp"
    done
done

# clean up
rm tmp/.files
rmdir tmp
0 голосов
/ 25 февраля 2019
mkdir jpeg_folder && mkdir png_folder  
mv *_jpeg.ext jpeg_folder && mv *_png.ext png_folder
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...