2016-01-24 4 views
1

I имеют следующую структуру файла:Bash скрипт для переименования нескольких файлов в подкаталоге с именем папки

Applications/Snowflake/applications/Salford_100/wrongname_120.nui; wrongname_200_d.nui 
Applications/Snowflake/applications/Salford_900/wrongname_120.nui; wrongname_200_d.nui 
Applications/Snowflake/applications/Salford_122/wrongname_120.nui; wrongname_200_d.nui 

И я хочу, чтобы переименовать ФСТЗ тем же именем, как каталоги, в которой они находятся, но файлы с «_d» в конце должны содержать последние два символа. Шаблон файла всегда будет «salford_xxx», где xxx всегда 3 цифры. Таким образом, итоговые файлы будут:

Applications/Snowflake/applications/Salford_100/Salford_100.nui; Salford_100_d.nui 
Applications/Snowflake/applications/Salford_900/Salford_900.nui; Salford_900_d.nui 
Applications/Snowflake/applications/Salford_122/Salford_122.nui; Salford_122_d.nui 

скрипта будет работать из другого места в

Applications/Snowflake/Table-updater 

Я полагаю, это потребовало бы для цикла и SED регулярного выражения, но Im открыто для любых предложений. (Спасибо @ghoti за ваш совет) Я пробовал это, которое в настоящее время не учитывает файлы с «_d», но я просто получил один файл, переименованный правильно. Некоторая помощь будет оценена по достоинству.

cd /Applications/snowflake/table-updater/Testing/applications/salford_* 

dcomp="$(basename "$(pwd)")" 
for file in *; do 
ext="${file##*.}" 
mv -v "$file" "$dcomp.$ext" 

done 

Ive Теперь обновленный сценарий следующего @varun совета (спасибо), и теперь он также просматривает все файлы в родительской директории, которые содержат Salford в названии, пропускает имя родителя. Пожалуйста, смотрите ниже

#!/bin/sh 
# 
# RenameToDirName2.sh 
# 
set -e 

cd /Applications/snowflake/table-updater/Testing/Applications/ 

find salford* -maxdepth 1 -type d \(! -name . \) -exec sh -c '(cd {} && 
    (
     dcomp="$(basename "$(pwd)")" 
     for file in *; 
     do ext="${file#*.}" 
      zz=$(echo $file|grep _d) 
     if [ -z $zz ] 
     then 
      mv -v "$file" "$dcomp.$ext" 
     else 
      mv -v "$file" "${dcomp}_d.$ext" 
    fi 
done 
) 
)' ';' 

Дело в том, что я просто понял, что в этих Salford подкаталоги существуют и другие файлы с различными расширениями, которые я не хочу переименовывать. Ive пытался ПОДАЧИ еще, если заявление оговорить * .Nui только файлы, назвав мою переменную $ DCOMP, как этот

else 
    if file in $dcomp/*.nui 
    then 
    #continue... 

Но я получаю ошибки. Где это должно быть в моем сценарии, а также у меня есть правильный синтаксис для этого цикла? Вы можете помочь?

+1

Таким образом, имя файла фактически является 'wrongname_120.nui; wrongname_200_d.nui', или эти два отдельных файла в одном каталоге? – Will

+0

2 отдельных файла в одном каталоге. Извиняюсь за любую путаницу. – Eggfoot

+0

Что вы пробовали? Большинство из нас здесь очень рады помочь вам научиться совершенствовать свое ремесло, но несколько менее счастливы служить неоплаченными обезьянами кода. – ghoti

ответ

1

@ eggfoot, я модифицировал мой сценарий, который будет изучать все каталоги в приложениях папок и искать папки, в которых есть Salford. Таким образом, вы можете назвать мой сценарий, как этого

./rename.sh/дома/имя пользователя/Applications/Снежинка е/приложений

#!/bin/bash 
# set -x 
path=$1 
dir_list=$(find $path/ -type d) 
for index_dir in $dir_list 
do 
    aa=$(echo $index_dir|grep Salford) 
    if [ ! -z $aa ] 
    then 
      files_list=$(find $index_dir/ -type f) 
      for index in $files_list 
      do 
        xx=$(basename $index) 
        z=$(echo $xx|grep '_d') 
        if [ -z $z ] 
        then 
          result=$(echo $index | sed 's/\/\(.*\)\/\(.*\)\/\(.*\)\(\..*$\)/\/\1\/\2\/\2\4/') 
          mv "$index" "$result" 
        else 
          result=$(echo $index | sed 's/\/\(.*\)\/\(.*\)\/\(.*\)_d\(\..*$\)/\/\1\/\2\/\2_d\4/') 
          mv "$index" "$result" 
        fi 
      done 
    fi 
    done 

Что касается СЭД, то он использует команду ы СЭД и заменить файл имя с именем каталога, сохраняя расширение как есть.

Что касается вашего скрипта, вам нужно использовать команду grep для поиска файлов с _d, и вы можете использовать замену параметров mv для файлов с _d и one без _d.

dcomp="$(basename "$(pwd)")" 
    for file in *; do 
    ext="${file##*.}" 
    zz=$(echo $file|grep _d) 
    if [ -z $zz ] 
    then 
    mv -v "$file" "$dcomp.$ext" 
    else 
    mv -v "$file" "${dcomp}_d.$ext" 
    fi 
    done 
+0

Спасибо за это @Varun, не могли бы вы рассказать о том, что происходит в sed regex's? Извините, я все еще изучаю все это. Кроме того, три цифры после имен Salford_xxx будут генерироваться случайным образом, поэтому аргумент для скрипта может быть следующим: ./rename.sh/home/username/Applications/Snowflake e/applications/Salford_ *? – Eggfoot

1

Вы можете написать:

(
    cd ../applications/ && \ 
    for name in Salford_[0-9][0-9][0-9] ; do 
     mv "$name"/*_[0-9][0-9][0-9].nui "$name/$name.nui" 
     mv "$name"/*_[0-9][0-9][0-9]_d.nui "$name/${name}_d.nui" 
    done 
) 

(. Примечание: (...) является подоболочка, чтобы ограничить область каталога-изменения и переменной name)

+0

Похоже, что это область видимости [0-9] [0-9] [0-9] в качестве фактического имени файла и помечена ошибка «Нет такого файла или каталога». – Eggfoot

+0

@Eggfoot: Поскольку у меня нет доступа к вашей коробке, мне пришлось работать с информацией, которую вы предоставили в вопросе. Поскольку ситуация на вашем ящике точно не соответствует тому, что находится в вопросе, вам может потребоваться соответствующим образом настроить ответ. – ruakh