Одно из возможных решений:
find . -name '*.jpg' -printf "'%p' '%h/thumb_%f'\n" | xargs -n2 echo mv
Принсипи: найдите все необходимые файлы и подготовьте аргументы для стандартной команды mv
.
Примечания:
- аргументы для
mv
заключены в '
для разрешения пробелов в именах файлов. - Недостаток: это не будет работать с именами файлов, которые содержат
'
апостроф, как многие mp3-файлы.Если вам нужно переместить более странные имена файлов, проверьте ниже. - указанная выше команда предназначена для пробного запуска (показывает только команды mv с аргументами).Для реальной работы удалите
echo
притворяясь mv
.
ЛЮБОЕ переименование имени файла.В оболочке нужен разделитель.Проблема в том, что имя файла (хранящееся в переменной оболочки) обычно может содержать сам разделитель, поэтому:
mv $file $newfile #will fail, if the filename contains space, TAB or newline
mv "$file" "$newfile" #will fail, if the any of the filenames contains "
правильное решение:
- подготовить имя файла с правильным экранированием
- использовать язык сценариев, который легко понимает ЛЮБОЕ имя файла
Подготовка правильного экранирования в bash возможна с его помощьювнутренняя директива форматирования printf
и %q
= print quoted
.Но это решение длинное и скучное.
ИМХО, самый простой способ - использовать perl
и дополнить нулями print0
, как показано ниже.
find . -name \*.jpg -print0 | perl -MFile::Basename -0nle 'rename $_, dirname($_)."/thumb_".basename($_)'
Выше описано использование возможности perl для манипулированияимена файлов и, наконец, переименовывает файлы.