Вы можете делать все, что вам нужно, с помощью find
, который ищет все *.jpg
файлы, и простым сценарием helper , вызываемым параметром -exec
для find
для создания каталога jpg
и переместите все .jpg
файлы в новый каталог.
Вспомогательный скрипт просто получит абсолютное имя файла, используя readlink -f
и затем используя быстрое расширение параметра , чтобы обрезать последний /...
компонент из абсолютного имени файла для получения полного пути.Тогда это просто вопрос создания каталога jpg
в конце пути и перемещения файла в новый каталог.
Ваш вспомогательный скрипт (я назвал его helper.sh
) может быть:
#!/bin/sh
test -z "$1" && exit ## validate 1 argument given or exit
full=$(readlink -f "$1") ## get full filename
dir="${full%/*}" ## get full path
test "${full##*.}" = 'jpg' || exit ## test extension is jpg or exit
test -z "$dir" && dir="/" ## check if file was in / (root)
test -d "$dir/jpg" || mkdir -p "$dir/jpg" ## check/create jpg dir at end of path
mv "$full" "$dir/jpg" ## move file into new jpg dir
( примечание: после создания вспомогательного скрипта, убедитесь, что вы сделали его исполняемым с chmod +x helper.sh
)
Оригинальные проектыДерево каталогов
$ tree Projects/
Projects/
├── Project_001
│ └── Image_001.jpg
├── Project_002
│ ├── Image_002.jpg
│ └── Image_003.jpg
└── Project_003
Ваша команда find
, работающая с каталогом Projects
, вызывающая вспомогательный скрипт для каждого файла, будет:
$ find Projects/ -type f -name "*jpg" -exec ./helper.sh '{}' \;
Результирующие проектыДерево каталогов
$ tree Projects/
Projects/
├── Project_001
│ └── jpg
│ └── Image_001.jpg
├── Project_002
│ └── jpg
│ ├── Image_002.jpg
│ └── Image_003.jpg
└── Project_003
Дайте мне знать, если у вас есть дополнительные вопросы.
Сохранение файлов уже в каталоге jpg
Per-yourдополнительный комментарий, чтобы сохранить файлы .jpg
, уже находящиеся в каталоге jpg
в ваших проектах, все, что вам нужно сделать, это добавить одну дополнительную проверку.Если последний компонент пути уже jpg
, просто выйдите из помощника, например,
test "${dir##*/}" = 'jpg' && exit ## if already in jpg dir, exit
Показано в контексте в helper.sh
:
test -z "$1" && exit ## validate 1 argument given or exit
full=$(readlink -f "$1") ## get full filename
dir="${full%/*}" ## get full path (trim last /*)
test "${dir##*/}" = 'jpg' && exit ## if already in jpg dir, exit
test "${full##*.}" = 'jpg' || exit ## test extension is jpg or exit
...
Исходные проектыДерево каталогов (с существующим jpg)
$ tree Projects/
Projects/
├── Project_001
│ ├── Image_001.jpg
│ └── jpg
│ └── Image_000.jpg
├── Project_002
│ ├── Image_002.jpg
│ ├── Image_003.jpg
│ └── jpg
│ ├── Image_000.jpg
│ └── Image_001.jpg
└── Project_003
Результирующие проекты Дерево каталогов
$ tree Projects/
Projects/
├── Project_001
│ └── jpg
│ ├── Image_000.jpg
│ └── Image_001.jpg
├── Project_002
│ └── jpg
│ ├── Image_000.jpg
│ ├── Image_001.jpg
│ ├── Image_002.jpg
│ └── Image_003.jpg
└── Project_003