0

I am trying to create a series of files with brace expansions. I want create the files fileA1 to fileZ100 with all possible combinations (Something like touch file[A..Z][1..100]).

If I run the command touch $(printf "file%d " {1..100}) the output is ok:

file1    file15  file21  file28  file34  file40  file47  file53  file6   file66  file72  file79  file85  file91  file98
file10   file16  file22  file29  file35  file41  file48  file54  file60  file67  file73  file8   file86  file92  file99
file100  file17  file23  file3   file36  file42  file49  file55  file61  file68  file74  file80  file87  file93
file11   file18  file24  file30  file37  file43  file5   file56  file62  file69  file75  file81  file88  file94
file12   file19  file25  file31  file38  file44  file50  file57  file63  file7   file76  file82  file89  file95
file13   file2   file26  file32  file39  file45  file51  file58  file64  file70  file77  file83  file9   file96
file14   file20  file27  file33  file4   file46  file52  file59  file65  file71  file78  file84  file90  file97

The same if I run touch $(printf "file%c " {A..Z}):

fileA  fileC  fileE  fileG  fileI  fileK  fileM  fileO  fileQ  fileS  fileU  fileW  fileY
fileB  fileD  fileF  fileH  fileJ  fileL  fileN  fileP  fileR  fileT  fileV  fileX  fileZ

I'm trying to combine them touch $(printf "file%c%d " {A..Z}{1..100}), but the output is:

[...]
-bash: printf: Y2: invalid number
-bash: printf: Y4: invalid number
-bash: printf: Y6: invalid number
-bash: printf: Y8: invalid number
-bash: printf: Y10: invalid number
-bash: printf: Y12: invalid number
-bash: printf: Y14: invalid number
-bash: printf: Y16: invalid number
-bash: printf: Y18: invalid number
-bash: printf: Y20: invalid number
-bash: printf: Y22: invalid number
-bash: printf: Y24: invalid number
-bash: printf: Y26: invalid number
-bash: printf: Y28: invalid number
-bash: printf: Y30: invalid number
-bash: printf: Y32: invalid number
-bash: printf: Y34: invalid number
-bash: printf: Y36: invalid number
-bash: printf: Y38: invalid number
-bash: printf: Y40: invalid number
-bash: printf: Y42: invalid number
-bash: printf: Y44: invalid number
-bash: printf: Y46: invalid number
-bash: printf: Y48: invalid number
-bash: printf: Y50: invalid number
-bash: printf: Y52: invalid number
-bash: printf: Y54: invalid number
-bash: printf: Y56: invalid number
-bash: printf: Y58: invalid number
-bash: printf: Y60: invalid number
-bash: printf: Y62: invalid number
-bash: printf: Y64: invalid number
-bash: printf: Y66: invalid number
-bash: printf: Y68: invalid number
-bash: printf: Y70: invalid number
-bash: printf: Y72: invalid number
-bash: printf: Y74: invalid number
-bash: printf: Y76: invalid number
-bash: printf: Y78: invalid number
-bash: printf: Y80: invalid number
-bash: printf: Y82: invalid number
-bash: printf: Y84: invalid number
-bash: printf: Y86: invalid number
-bash: printf: Y88: invalid number
-bash: printf: Y90: invalid number
-bash: printf: Y92: invalid number
-bash: printf: Y94: invalid number
-bash: printf: Y96: invalid number
-bash: printf: Y98: invalid number
-bash: printf: Y100: invalid number
-bash: printf: Z2: invalid number
-bash: printf: Z4: invalid number
-bash: printf: Z6: invalid number
-bash: printf: Z8: invalid number
-bash: printf: Z10: invalid number
-bash: printf: Z12: invalid number
-bash: printf: Z14: invalid number
-bash: printf: Z16: invalid number
-bash: printf: Z18: invalid number
-bash: printf: Z20: invalid number
-bash: printf: Z22: invalid number
-bash: printf: Z24: invalid number
-bash: printf: Z26: invalid number
-bash: printf: Z28: invalid number
-bash: printf: Z30: invalid number
-bash: printf: Z32: invalid number
-bash: printf: Z34: invalid number
-bash: printf: Z36: invalid number
-bash: printf: Z38: invalid number
-bash: printf: Z40: invalid number
-bash: printf: Z42: invalid number
-bash: printf: Z44: invalid number
-bash: printf: Z46: invalid number
-bash: printf: Z48: invalid number
-bash: printf: Z50: invalid number
-bash: printf: Z52: invalid number
-bash: printf: Z54: invalid number
-bash: printf: Z56: invalid number
-bash: printf: Z58: invalid number
-bash: printf: Z60: invalid number
-bash: printf: Z62: invalid number
-bash: printf: Z64: invalid number
-bash: printf: Z66: invalid number
-bash: printf: Z68: invalid number
-bash: printf: Z70: invalid number
-bash: printf: Z72: invalid number
-bash: printf: Z74: invalid number
-bash: printf: Z76: invalid number
-bash: printf: Z78: invalid number
-bash: printf: Z80: invalid number
-bash: printf: Z82: invalid number
-bash: printf: Z84: invalid number
-bash: printf: Z86: invalid number
-bash: printf: Z88: invalid number
-bash: printf: Z90: invalid number
-bash: printf: Z92: invalid number
-bash: printf: Z94: invalid number
-bash: printf: Z96: invalid number
-bash: printf: Z98: invalid number
-bash: printf: Z100: invalid number

So... what is the correct regular expression? Should I use pipes?

  • 2
    Note that this has nothing to do with regular expressions, but with brace expansions and the way printf format strings work. – Kusalananda Nov 13 '19 at 14:40
  • yeah, regular expressions are usually used to match existing strings, not to generate them. In many common cases, they can match an infinite number of strings (if there's even one * or + or {n,}), so generating them wouldn't even be possible. And the RE [1..100] would match one of the characters 1, . or 0, not full numbers. – ilkkachu Nov 13 '19 at 14:49
4

So, here:

printf "file%c%d " {A..Z}{1..100}

The brace expansion produces strings like A1, A2, A3... Z99, Z100. Then printf tries to match those to the format specifiers %c and %d, using the first for %c, second for %d, third for %c again, etc.

But %d expects a number and A2 isn't one, so there's an error.

%c%d would expect arguments like A, 1, A, 2..., as distinct arguments, but that would be hard to generate with brace expansion.

Since the brace expansion already combines the letter and number sequences, you can just use printf "file%s " {A..Z}{1..100} to use the results of the expansion as-is. Or even just echo file{A..Z}{1..100}.

Or the even more direct version pLumo's answer has.

3

You can use brace expansion directly with touch:

touch file{A..Z}{1..100}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.