Цикл по алфавиту в Bash


84

Я хочу, чтобы mvвсе файлы, начинающиеся с «x», были помещены в каталог «x»; что-то вроде:

mv path1/x*.ext path2/x

и проделаем это для всех букв алфавита a, ..., z

Как я могу написать сценарий bash, который заставляет «x» проходить по алфавиту?

Ответы:


140
for x in {a..z}
do
    echo "$x"
    mkdir -p path2/${x}
    mv path1/${x}*.ext path2/${x}
done

1
Могу я спросить, почему вы заключаете x в фигурные скобки в 4-й и 5-й строке?
Jiaqi Li

Здесь это не обязательно, но хорошо, это работает и делает параметры лучше;) gnu.org/software/bash/manual/…
Камил

1
Обычно этого "$x"достаточно, и это лучший способ выделить его.
Weijun Zhou

39

Это должно помочь вам начать:

for letter in {a..z} ; do
  echo $letter
done

21

вот как сгенерировать испанский алфавит, используя расширение вложенных скобок

for l in {{a..n},ñ,{o..z}}; do echo $l ; done | nl
1  a
 ...
14  n
15  ñ
16  o
...
27  z

Или просто

echo -e {{a..n},ñ,{o..z}}"\n" | nl

Если вы хотите сгенерировать устаревший 29-значный испанский алфавит

echo -e {{a..c},ch,{d..l},ll,{m,n},ñ,{o..z}}"\n" | nl

То же самое можно сделать для французского или немецкого алфавита.


3

Использование rename:

mkdir -p path2/{a..z}
rename 's|path1/([a-z])(.*)|path2/$1/$1$2' path1/{a..z}*

Если вы хотите убрать начальный символ [az] из имени файла, обновленный perlexpr будет:

rename 's|path1/([a-z])(.*)|path2/$1/$2' path1/{a..z}*


1

Этот вопрос и ответы частично помогли мне решить мою проблему.
Мне нужно было навести лупу над частью алфавита в bash.

Хотя расширение строго текстовое

Я нашел решение и сделал его еще проще:

START=A
STOP=D
for letter in $(eval echo {$START..$STOP}); do
    echo $letter
done

Что приводит к:

A
B
C
D

Надеюсь, это поможет кому-то, кто ищет ту же проблему, которую я должен был решить, и тоже оказывается здесь.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.