Переименовать имя папки в bash - PullRequest
0 голосов
/ 08 марта 2012

Мне нужно переименовать следующие папки:

d_001_d  
d_001_h  
d_005_d  
d_005_h  
d_007_d  
d_007_h  

In:

d_a_d  
d_a_h  
d_b_d  
d_b_h  
d_c_d  
d_c_h  

Таким образом, в основном, каждый код соответствует номеру (букве)Я попытался с помощью команды sed и цикла for с массивом, но я не смог получить именно то, что хотел.

Спасибо за помощь

Ответы [ 5 ]

3 голосов
/ 08 марта 2012
bos:$ ls
d_001_d  d_001_h  d_005_d  d_005_h  d_007_d  d_007_h
bos:$ for x in * ; do mv $x $(echo $x | sed -e 's/001/a/;s/005/b/;s/007/c/') ; done
bos:$ ls
d_a_d  d_a_h  d_b_d  d_b_h  d_c_d  d_c_h
1 голос
/ 08 марта 2012

С помощью инструмента perl rename вы можете переименовать с помощью регулярных выражений:

rename -n 'y/[157]/[abc]/;s/00//' d_00?_?

d_001_d renamed as d_a_d
d_001_h renamed as d_a_h
d_005_d renamed as d_b_d
d_005_h renamed as d_b_h
d_007_d renamed as d_c_d
d_007_h renamed as d_c_h

Пропустить -n, если тест с -n (действительно) дает хороший результат.

1 голос
/ 08 марта 2012

Без жесткого кодирования числа-> сопоставления символов:

chr() { [[ ${1} -lt 256 ]] || return 1; printf \\$(printf '%03o' $1); }

printf "%s\n" d_001_d  d_001_h  d_005_d  d_005_h  d_007_d  d_007_h | 
while read name; do 
  prefix=${name%%_*}
  suffix=${name##*_}
  [[ $name =~ ([0-9]+) ]] && num=$((96+10#${BASH_REMATCH[1]}))
  printf -v new_name "%s_%s_%s" $prefix $(chr $num) $suffix
  echo $new_name 
done

выходы

d_a_d
d_a_h
d_e_d
d_e_h
d_g_d
d_g_h

chr функция вежливости этот ответ

1 голос
/ 08 марта 2012

Если имена каталогов имеют одинаковую длину, вы можете использовать это:

#!/bin/bash

for DIR in `ls */ -d`
do
    INDEX=${DIR:2:3}
    case $INDEX in
        001)
            LETTER="a"
            ;;
        005)
            LETTER="b"
            ;;
        007)
            LETTER="c"
            ;;
    esac
    mv "$DIR" ${DIR/$INDEX/$LETTER}
done
1 голос
/ 08 марта 2012
$ ls
d_001_d  d_001_h  d_005_d  d_005_h  d_007_d  d_007_h
$ ls | awk -F_ -v OFS=_ 'BEGIN{d["001"]="a"; d["005"]="b"; d["007"]="c"}; {old=$0; $2=d[$2]; printf("mv %s %s\n", old, $0)}' | bash
$ ls
d_a_d  d_a_h  d_b_d  d_b_h  d_c_d  d_c_h
...