Переименование файлов в подпапках с именами родительских папок

У меня есть основной каталог, который имеет четыре папки 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.

1
задан 28 September 2014 в 21:15

2 ответа

Создайте простой файл 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)))
0
ответ дан 28 September 2014 в 21:15

С циклом и некоторыми обработками строк удара

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, как только Вы подтвердили, что это соответствует файлам правильно)

0
ответ дан 28 September 2014 в 21:15

Другие вопросы по тегам:

Похожие вопросы: