Написание скрипта для копирования двух файлов из каждого каталога в каждый из соответствующих им каталогов - PullRequest
0 голосов
/ 02 июля 2019

У меня есть 19 каталогов (0, n10, n20, n30, ... n180) в папке «mini». Мне нужно скопировать два файла из каждого каталога (0_mini_vh1.coor и 0_mini_vh1.xsc, n10_mini_vh1.coor и n10_mini_vh1.xsc и т. Д.) В соответствующие каталоги с одинаковыми именами (0, n10, n20 и т. Д.) В папке «производство». Пока что я написал это для сценария, но, похоже, он не работает. Как мне улучшить скрипт?

#!/usr/bin/env bash
for f in n10  n100  n110  n120  n130  n140  n150  n160  n170  n180  n20  n30  n40  n50  n60  n70  n80  n90
do
cd $f
echo "cp $f_mini_vh1.coor ../../production/$f"
echo "cp $f_mini_vh1.xsc ../../production/$f"
cd ../
done

Ответы [ 2 ]

1 голос
/ 02 июля 2019
for f in n{10..180..10}; do (
    cd "$f"
    echo cp "$f"_mini_vh1.{coor,xsc} ../../production/"$f"
) done

Вы можете использовать фигурные скобки для расширения до всех желаемых имен: {start..stop..incr}. Вы можете использовать один и тот же прием для объединения двух имен файлов с {coor,xsc}.

Будьте внимательны при написании $f_mini_vh1. Это переменная с именем f_mini_vh1. Чтобы отделить f от остальных, вам нужно написать либо ${f}_mini_vh1, либо "$f"_mini_vh1. Я рекомендую последним руководствоваться общими рекомендациями о том, что всегда следует указывать расширения переменных.

подоболочка с круглыми скобками избавит вас от необходимости cd ../ каждый раз. Мне нравится использовать подоболочку каждый раз, когда я использую cd в скрипте, чтобы ограничить область изменения каталога.

Вы также можете просто полностью пропустить cd, передав добавление $f в команду cp:

for f in n{10..180..10}; do
    echo cp "$f"/"$f"_mini_vh1.{coor,xsc} ../production/"$f"
done
0 голосов
/ 04 июля 2019

Это также можно сделать с помощью массива и цикла while!

Вот как я бы это сделал:

arr=(0 n10  n100  n110  n120  n130  n140  n150  n160  n170  n180  n20  n30  n40  n50  n60  n70  n80  n90)
cnt=0
while [ $cnt -lt ${#arr[@]} ]; do
f=${arr[$cnt]}
cp ./$f/${f}_mini_vh1.xsc ../production/$f
cp ./$f/${f}_mini_vh1.coor ../production/$f
let cnt=cnt+1
done

Но я все еще относительно новичок и всегда учусьи метод Джона кажется чище, но я хотел предложить альтернативу :) Это тоже должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...