У меня есть основной каталог, который имеет четыре папки f1, f2, f3 and f4
, каждая из этих папок имеет 10 папок, и каждая из этих 10 папок ff1...ff10
имеет несколько .jpeg
изображений с некоторыми именами, скажем, image1
.... и так далее. Что я хочу знать, так это как переименовать эти изображения .jpeg в каждой из этих папок по 10 папок в каждой из f1, f2, f3 and f4
, чтобы я объединял родительские папки в начале их имени, например image1.jpeg
находится в f3/ff1
, тогда его имя будет f3_ff1_image1.jpeg
, то же самое со всеми другими изображениями в других 10 папках в каждой из четырех основных папок. Если кто-нибудь может посоветовать, как это можно сделать, в файле .sh
.
Создайте простой файл changeName.sh
следующим образом:
#!/bin/bash
fileName=$(basename $1)
filepath=$(dirname $1)
secondDir=$(basename $filepath)
firstDir=$(basename $(dirname $filepath))
parentDir=$(basename $(dirname $(dirname $filepath)))
mv $1 $filepath/${parentDir}_${firstDir}_${secondDir}_$fileName
сохраняют его, например, в /home/yourUser/bin
.
разрешение Изменения к changeName.sh
:
chmod +x /home/yourUser/bin/changeName.sh
Открытый Вы /home/yourUser/.bashrc
файл и добавляют в конце эту строку:
PATH=$PATH:/home/yourUser/bin
сохраняют его и перезагружают его:
source .bashrc
Теперь у Вас есть новая утилита, которая может изменить имя на папку использования файла как часть имени.
Попытка это:
find mainDirectory -name "*.jpeg" -exec changeName.sh {} \;
mainDirectory
может быть абсолютным или относительным.
Протестированный на <часе> lubuntu 12.04
полоса dirname длятся компонент от имени файла в то время как базовое имя каталог полосы и суффикс от имен файлов.
Так для получения третьего уровня каталога:
parentDir=$(basename $(dirname $(dirname $filepath)))
С циклом и некоторыми обработками строк удара
while read -rd (удаляют echo
, как только Вы подтвердили, это соответствует файлам правильно)
С находящимся в perl rename
команда, и удар globstar
shopt -s globstar
rename -nv -- 's|(f\d+)/(ff\d+)/(image\d+)|$1/$2/$1_$2_$3|' **/*.jpeg
(удалите -nv
, как только Вы подтвердили, что это соответствует файлам правильно)
\0' f; do
d="${f%/*}"; p="${d/\//_}";
echo mv -- "$f" "${d}/${p}_${f##*/}"
done < <(find -type f -name '*.jpeg' -printf '%P\0')
(удаляют echo
, как только Вы подтвердили, это соответствует файлам правильно)
С находящимся в perl rename
команда, и удар globstar
shopt -s globstar
rename -nv -- 's|(f\d+)/(ff\d+)/(image\d+)|$1/$2/$1_$2_$3|' **/*.jpeg
(удалите -nv
, как только Вы подтвердили, что это соответствует файлам правильно)