Как я могу манипулировать подкаталогами в оболочке?

Например, запуск команды по n-числу отсортированных подкаталогов, где n – вход. Или как я могу запустить цикл for в ряде подкаталогов, где я могу указать этот диапазон как вход? Как и далее, кроме как определить диапазон здесь?

for d in ["sd1"-"sd2"] do ( cd "$d" && do stuff ) done 

Используйте расширение скобки, если у вас есть оболочка, которая его поддерживает:

 for d in sd{1..2}; do ( cd "$d" && dostuff ) done 

С zsh , ksh93 или ksh93 yash -o braceexpand (но не bash ) вы можете сделать

 n=4 for d in sd{1..$n}; do ( cd "$d" && dostuff ) done 

Связанный вопрос: Могу ли я использовать переменные внутри {} расширения без `eval`?

Вариант этого будет

 for (( i=1; i<=n; ++i )); do str="sd$i" ( cd ... ) done 

Это цикл цикла C, поддерживаемый bash и другими оболочками (хотя это еще и расширение стандарта POSIX).

Другим возможным решением является использование команды seq (где доступно)

 for i in `seq -f "sd%03.0f" 111 121` do ( cd "$i" && do stuff ) done 

С помощью zsh вы можете:

 for d (sd<1-10>(Nn-/)) (cd $d && dostuff) 
  • <1-10> – оператор glob, который соответствует десятичным целым числам от 1 до 10. Он будет соответствовать 1 , 001 … Вы можете сделать его <-> для соответствия любому положительному десятичному целому числу.
  • (Nn-/) является квалификатором glob.
    • N не провалится, если нет совпадения
    • n для сортировки элементов численно (поэтому sd10 появляется после sd2 )
    • -/ включать только файлы типа directory (после разрешения symlink).

Если вы хотите перечислить каталоги между двумя датами, где дата закодирована в имени каталога (например, sd2017-08-01 ):

 for d (sd<->-<->-<->(Nne{' [[ ! $REPLY < sd2015-06-06 && ! $REPLY > sd2017-08-09 ]]'}-/)) (cd $d && dostuff) 

Разделы Glob сортируются, что означает, что вы можете сделать что-то вроде:

 state=0 for d in *; do case $d in "sd1") state=1;; "sd2") break;; esac if [ 1 -eq "$state" ]; then ( cd "$d" && dostuff ) fi done 

Я предполагаю, что sd1 и sd2 не являются реальными примерами и что диапазон не может быть описан с тривиальными числовыми диапазонами. Если они могут, я бы воспользовался решением Ромео Нинова .

Расширения Brace очень аккуратные, но, к сожалению, многие оболочки POSIX их не имеют, поскольку они не являются требованием POSIX.