9k + изображений в условной нумерации.Хотите отсортировать каждые 200 в папку с соответствующим названием.BASH Ubuntu - PullRequest
0 голосов
/ 20 января 2011

Пример имени файла в конце: = 09059.png

Чего я хочу добиться, так это разбить эти файлы на папки.Каждая папка будет содержать 200 изображений.Например, изображение 00001.png - 00200.png будет перемещено в папку с именем [200].

Ниже приведен псевдокод, который я как бы выделил для bash:

cnt=0

if $cnt<100
do

for i in *; do x=${f%%.*}; 

echo "Doing somthing to $x"; done;
fi

elsif $cnt=100 do 

mkdir "$cnt"
move all files scaned till the current cnt.

endif

reset

Ответы [ 2 ]

1 голос
/ 21 января 2011

Если вы согласитесь на 100 файлов в каталоге вместо 200, мы можем сделать это в одной строке:

find . -maxdepth 1 -iname '[0-9][0-9][0-9][0-9][0-9].png' | sed 's/^\(.*\)\([0-9][0-9][0-9]\)\([0-9][0-9]\)\(.*\)$/mkdir -p \1\200 ; mv \1\2\3\4 \1\200\/\2\3\4/' | bash

Вот что он делает:

  • Найти: Находит все файлы (5 цифр) .png, только в указанном каталоге.
  • Sed: выполняет поиск / замену на выходе Find.
    • Находит: последовательность из 3 цифр, затем 2 цифры.Запомните обе группы цифр и весь текст до и после него в строке.Текст перед цифрами будет путем, текст после него будет расширением.
    • Замените двумя командами
      • mkdir -p (путь) (первые 3 цифры) 00
      • mv (весь исходный путь) (путь) (первые 3 цифры) 00 / (первые 3 цифры) (последние 2 цифры) (расширение)
  • И передайте все это Bash, чтобы он действительно его запустил.

Если вы хотите проверить это, введите команду, но замените | bash на > file.Все команды, которые будут выполнены, будут в файле.Если хотите, сделайте его исполняемым и запустите его там.Или удалите | bash и он выведет на экран.

Мой тест: touch 00000.png 00010.png 01010.png

Результат:

mkdir -p ./00000 ; mv ./00010.png ./00000/00010.png
mkdir -p ./00000 ; mv ./00000.png ./00000/00000.png
mkdir -p ./01000 ; mv ./01010.png ./01000/01010.png
0 голосов
/ 20 января 2011

Непроверенные:

#!/bin/bash
count=0
source='/path1'
dest='/path2'
dir=200
echo mkdir "$dest/$dir"    # remove the echo if test succeeds

for file in "$source"/*
do
    if [[ -f "$file" ]]
    then
        echo mv "$file" "$dest/$dir"    # remove the echo if test succeeds
        ((count++))
        if (( ! ( count % 200 ) ))
        then
            ((dir += 200))    # dirs will be named 200, 400, 600, etc.
            echo mkdir "$dir"           # remove the echo if test succeeds
        fi
    fi
done
...