Перемещение изображений в папки с именем файла изображения


У меня есть папка под названием folder1, в которой есть куча картинок, и я хотел бы сохранить каждую картинку в отдельной папке. Папка должна иметь то же имя, что и файл, например, если картинка называется "st123", я хотел бы создать папку под названием "st123" и переместить картинку в папку. Я попробовал следующее, Но я получаю ошибку не может переместиться в подкаталог самого себя. Есть ли другой способ решить эту проблему? В противном случае, это было бы возможно, чтобы сохранить изображение "st123" в папке под названием "123" (то есть последние 3 символа)?

#!/bin/bash
Parent="/home/me/myfiles/folder1"
for file in $Parent; do
dir="${file%%.*}"
mkdir -p "$dir"
mv "$file" "$dir" 
done
2 2

2 ответа:

Это решение может быть полезно для вас, хотя если вы хотите перебирать изображения рекурсивно, я предлагаю вам использовать find. Если это действительно так, дайте мне знать, и я отредактирую этот ответ соответствующим кодом.

for image in /home/me/myfiles/folder1/*; do
    if [[ -f $image ]]; then 
        newf="${image%%?([ab]).*}"
        mkdir -p "$newf"
        mv -- "$image" "$newf"
    fi
done

Тест (extglob включен):

$ [/home/rany/] touch test/st123a.tif test/st123b.tif test/st456.jpg test/st456b.jpg test/st789.tif
$ [/home/rany/] for image in test/*; do newf="${image%%?([ab]).*}"; mkdir -p "$newf"; mv -- "$image" "$newf";done
$ [/home/rany/] tree test
test
├── st123
│   ├── st123a.tif
│   └── st123b.tif
├── st456
│   ├── st456b.jpg
│   └── st456.jpg
└── st789
    └── st789.tif

3 directories, 5 files

Правка:

В соответствии с запросом OP я добавил следующие изменения:

  • обрезать суффикс имени файла a или b, чтобы, например, имена файлов st123a. ext и st123b. ext перейдет в тот же каталог st123 . Важно : эта функция требует extglob включено (то есть shopt -s extglob).

У тебя почти получилось! Измените часть строки 3 так, чтобы цикл for повторял то, что находится внутри каталога, а не сам каталог:

#!/bin/bash
Parent="/home/me/myfiles/folder1"
for file in $Parent/*; do
dir="${file%%.*}"
mkdir -p "$dir"
mv "$file" "$dir" 
done

Https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html#Command-Substitution