Цикл алфавітів у 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"буває достатньо і кращого способу виділити його.
Вейджунь Чжоу,

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.