Думаю, так и будет:
cd your_source_dir || exit
for file in *; do
if [[ $(echo "$file" | grep -Pw "[a-z]{4}[0-9]{4}") ]]; then
dir="${file:0:4}"
[[ -d "$dir" ]] || mkdir "$dir"
[[ -f "$file"]] && mv "$file" "$dir/"
fi
done
Предполагая, что ваша команда find
находит именно те файлы, которые вы хотите переименовать, вы можете переименовать их, вызвав mv
из find
с помощью -execdir
следующим образом:
find. -name logo.png -size 56431c -execdir mv {} oldlogo.png \;
Предикат -execdir
не является стандартным -, но часто используется. Он выполняет данную утилиту в каталоге, где было найдено имя, с заменой {}
именем файла (GNU find
добавит ./
к имени файла, в то время как другие реализации find
могут этого не делать. что ). В приведенной выше командемы используем этот факт, чтобы переименовать файл logo.png
в oldlogo.png
без указания пути к каталогу.
Используя стандарт find
, вы можете сделать это вместо этого:
find. -name logo.png -size 56431c -exec sh -c '
for pathname do
mv "$pathname" "${pathname%/*}/oldlogo.png"
done' sh {} +
Приведенный выше вызов вызовет sh -c
с путями пакетов найденных файлов. Сценарий строки -будет перебирать заданный пакет имен путей и переименовывать каждый из них в oldlogo.png
в том же каталоге, где он был найден find
. Подстановка параметра ${pathname%/*}
удалит последний /
и все после него из значения $pathname
(, так что он действует как dirname "$pathname"
в том смысле, что он возвращает часть каталога пути ).