Функция цикла сортировки создает бесконечные подкаталоги - PullRequest
0 голосов
/ 07 апреля 2019

Мне обычно приходится сортировать большое количество изображений в нескольких папках на два типа файлов: «.JPG» и «.CR2». Я довольно новичок в bash, но создал базовый сценарий, который будет успешно сортировать одну отдельную папку и делить эти типы файлов на отдельные папки.

У меня проблемы с масштабированием, чтобы автоматически перебирать подкаталоги. Мой текущий скрипт создает бесконечный цикл новых подпапок, пока не истечет время ожидания терминала.

Как я могу использовать функцию цикла без циклического перебора новых папок?

function f {
    cd "$1"
            count=`ls -1 *.JPG 2>/dev/null | wc -l`
                if [ $count != 0 ]; then 
                    echo true
                    mkdir JPG; mv *.JPG jpg
                else
                    echo false
                fi
            count=`ls -1 *.CR2 2>/dev/null | wc -l`
                if [ $count != 0 ]; then 
                    echo true
                    mkdir RAW; mv *.CR2 raw;
                else
                    echo false
                fi
    for d in * .[!.]* ..?*; do
        cd "$1"
        test -d "$1/$d" && f "$1/$d"
    done
}

f "`pwd`"

1 Ответ

0 голосов
/ 07 апреля 2019

Я все же советую людям использовать find вместо глобуляции * в сценариях. * может работать не всегда надежно, может не работать и сбивать с толку.

Сначала мы создаем каталоги, чтобы перейти к:

mkdir -p ./jpg ./cr2

Обратите внимание, что -p в mkdir сделает mkdir не ошибкой, если каталог уже существует.

Используйте find. Найдите все файлы с именем *.JPG и переместите каждый файл в jpg:

find . -maxdepth 1 -mindepth 1 -name '*.JPG' -exec mv {} ./jpg \;
// similar
find . -maxdepth 1 -mindepth 1 -name '*.CR2' -exec mv {} ./cr2 \;

-maxdepth 1 -mindepth 1 таков, что find не сканирует каталог рекурсивно, что по умолчанию. Вы можете удалить их, но при желании вы можете добавить -type f, чтобы включить только файлы.

Примечания к вашему сценарию:

  • Не анализировать вывод ls
  • Вы можете использовать find . -mindepth 1 -maxdepth 1 -file '*.jpg' -print . | wc -c, чтобы получить количество файлов в каталоге.
  • for d in * .[!.]* ..?*; do У меня есть смутное представление о том, что это должно делать, что-то вроде рекурсивного сканирования каталога. Если, если каталог JPG находится внутри $(pwd), вы будете бесконечно сканировать себя и перемещать файл в себя и т. Д. Если папка назначения находится вне текущего каталога, просто измените сценарии find, удалив -mindepth 1 , тогда он будет сканировать рекурсивно.
  • Не используйте обратные пометки, они менее читабельны и устарели . Вместо этого используйте $( .. ).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...