2016-07-14 5 views
-1

Я пишу сценарий оболочки unix, который сортирует данные в десяти подкаталогах (помеченных 1-10) в домашнем каталоге. В каждом подкаталоге сценарий должен переименовывать файлы hehd.output и fort.hehd.time, а также скопировать файл hehd.data в файл .data с новым именем.Именование файла с переменной в сценарии оболочки

То, что я хотел бы это сделать, это переименовать каждый из этих файлов в следующем формате:

AA.BB.CC

Где

AA = a variable in the hehd.data file within the subdirectory containing the file 
    BB = the name of the subdirectory containing the file (1-10) 
    CC = the original file name 

Каждый подкаталог содержит hehd. файл данных, и каждый файл hehd.data содержит строку ij0 = AA, где AA представляет переменную, которую я хочу использовать, чтобы переименовать файлы в том же подкаталоге.

Например: При запуске сценария следует искать /home/4/hehd.data для строки ij0 = 2, а затем перейти к /home/4/hehd.output /home/4/2.4.hehd .вывод.

В настоящее время я использую команду grep для поиска скрипта для строки ij0 = * и скопируйте ее в новый текстовый файл в подкаталоге. Затем строка ij0 = удаляется из текстового файла, а затем ее содержимое используется для переименования всех целевых файлов в том же подкаталоге. Последняя строка сценария оболочки удаляет текстовый файл.

Я ищу лучший способ для этого, желательно, чтобы все десять подкаталогов можно было отсортировать сразу одним и тем же сценарием. Мой сценарий кажется невероятно неэффективным и не делает все, что я хочу, сам по себе.

Как я могу улучшить это?

Любые советы или предложения были бы оценены; Я пытаюсь стать лучшим пользователем компьютера, а это значит, что мы должны лучше учиться.

+1

Просьба представить фактический код, а не только английский псевдокод. Реализация детали имеет значение, и мы не можем видеть, что они есть, не читая реализацию. –

+1

(Кроме того, в StackOverflow есть предпочтение для целенаправленных вопросов с конкретными ответами, открытые вопросы, которые могут быть истолкованы как «можно обсудить X?», Здесь не совсем приветствуются, а не вопрос «как я могу исправить проблему X? », которая имеет конкретное решение, для общего назначения« как я могу улучшить этот уже действующий код? »вопросы, см. http: //codereview.stackexchange.com/- но читайте правила сайта там, а не просто переписываете). –

+1

... http://stackoverflow.com/help/dont-ask охватывает аналогичную территорию. –

ответ

0

Попробуйте это:

fromdir=/home 
for i in {1..10};do 
    AA=$(sed 's/ij0=\([0-9]*\)/\1/' "$fromdir/$i/hehd.data") 
    BB="$i" 
    for f in "$fromdir/$i/"*;do 
    CC="${f##*/}" 
    if [[ "$CC" = "hehd.data" ]]; then 
     echo cp "$f" "$fromdir/$i/$AA.$BB.$CC" 
    else 
     echo mv "$f" "$fromdir/$i/$AA.$BB.$CC" 
    fi 
    done 
done 

Он перебирает каталоги с использованием последовательности Bash {1..10].

В каждой директории с командой sed значение ij0 присваивается переменной AA, имя каталога присваивается BB.

В файловом цикле, если файл hehd.data, он скопирован, иначе он будет переименован в новое имя.

Вы можете удалить echo до cp и mv команд, если выход соответствует вашим потребностям.

+0

Без OP, отправляющего свой код, вы можете получить тот же самый код, который он уже написал. – alvits

+0

@alvits Он дает краткое описание своего подхода (создайте файл из выхода 'grep', удалите имя переменной из файла, удалите файл), который не является моим. Подождем и посмотрим. – SLePort