Скрипт Bash для перебора определенного набора имен файлов и выполнения команд - PullRequest
2 голосов
/ 30 ноября 2010

У меня есть набор папок, названных, например, 10, 12, 13, 14, 18, 24 и т. Д. Они не меняют числа ни при каком стандартном приращении.Затем мне нужно периодически перемещаться в папки, а затем в следующую, чтобы выполнять команды SVN, которые являются одинаковыми, за исключением некоторого расширения переменной, например:

/home/boy$ cp /home/files/*Session10.* . ; svn add *Session10.*; svn commit; cd ..; cd 12;

Тогда следующая команда аналогична:

/home/boy$ cp /home/files/*Session12.* . ; svn add *Session12.*; svn commit; cd ..; cd 14;

Таким образом, должен быть определен массив или список, а затем цикл for по этому списку, а затем переменная, имя которой раскрывается для передачи в команды cp и svn.Какие-нибудь мысли?Я надеюсь, что это можно сделать в командной строке, а не в файле сценария bash.

Ответы [ 4 ]

2 голосов
/ 30 ноября 2010

Легкий путь:

for dir in [0-9][0-9]/; do
    cd "$dir"
    cp /home/files/*Session${dir%/}.* .
    svn add *Session${dir%/}.*
    svn commit
    cd ..
done

Это будет только итерация по каталогам, состоящим из 2 цифр.

1 голос
/ 30 ноября 2010

Время для решения на основе поиска.

find . -maxdepth 1 -regextype posix-extended -type d -regex '.*/[0-9]{2}$' -exec \
    bash -c 'dir=${1##*/}
    cd $1 
    cp /home/files/*Session{$dir}.* . 
    svn add *Session${dir}.* 
    svn commit'  -- {} \;

РЕДАКТИРОВАТЬ: теперь более находчиво, чем когда-либо.

1 голос
/ 30 ноября 2010

Если список предопределен, и вы не выполняете итерацию по всем существующим каталогам (другими словами, если каталог с именем 99 существует, но его нет в вашем списке, вы хотите исключить его), вы можете выполнить итерацию по списку:

list="10 12 13 14 18 24"; for dir in $list; do cd "$dir"; do_something "foo $dir bar"; done

или массив:

array=(10 12 13 14 18 24); for idx in ${!array[@]}; do cd "${array[idx]}"; do_something "foo ${array[idx]} bar"; done

Вы можете сделать предыдущий или следующий элемент массива, например так: ${array[idx-1]} или ${array[idx+1]}, если вы делаете соответствующие проверки, чтобы убедиться, что вы 'мы не пытаемся получить элемент с отрицательным индексом (индекс за последним элементом вернет ноль).

или:

array=(10 12 13 14 18 24); for dir in ${array[@]}; do cd "$dir"; do_something "foo $dir bar"; done

, что по сути совпадает с примером спискавыше.

1 голос
/ 30 ноября 2010

base=$PWD; for num in *; do cd $base/$num; cp /home/files/*Session${num}.* .; svn add *Session${num}.*; svn commit; done

...