Перемещение изображений в папки с именем файла изображения
У меня есть папка под названием 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 ответа:
Это решение может быть полезно для вас, хотя если вы хотите перебирать изображения рекурсивно, я предлагаю вам использовать
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