Visit Our UNIX and Linux User Community


Using variables to copy files with increasing numerical names.


 
Thread Tools Search this Thread
Top Forums UNIX for Beginners Questions & Answers Using variables to copy files with increasing numerical names.
# 1  
Old 03-08-2020
Using variables to copy files with increasing numerical names.

Hello, I have been learning Linux shell commands for about 4 months now. I am trying to write a simple shell script, but I have encountered an issue I do not understand the cause of.

Code:
#!/bin/bash

first=1
last=10

cp path/to/files/{$first..$last}.dat ./

When I run my script I get an error.
[user@x dir]$ ./myscript.sh
cp: cannot stat `path/to/file/{1..2}.dat': No such file or directory
[user@x dir]$

However when I run it without variables.
Code:
#!/bin/bash

cp path/to/files/{1..10}.dat ./

Running script without variables.
[user@x dir]$ ./myscript.sh

It copies the ten *.dat files from the path/to/files to the directory of myscript.sh. How can I get the script working with variables? Thanks in advance for any help given.
# 2  
Old 03-08-2020
This is a "brace expansion". It is expanded before any other expansions, and it cannot take any variables; read man bash very carefully:

Quote:
Brace Expansion
Brace expansion is a mechanism by which arbitrary strings may be generated. This mechanism is similar to pathname expansion, but the filenames generated need not exist. Patterns to be brace expanded take the form of an optional preamble, followed by either a series of comma-separated strings or a sequence expression between a pair of braces, followed by an optional postscript.
.
.
.
A sequence expression takes the form {x..y[..incr]}, where x and y are either integers or single characters, and incr, an optional increment, is an integer.

.

.
.
Brace expansion is performed before any other expansions, and any characters special to other expansions are preserved in the result. It is
strictly textual. Bash does not apply any syntactic interpretation to the context of the expansion or the text between the braces.
Those strings, integers, or characters are constants, not variables.
These 2 Users Gave Thanks to RudiC For This Post:
# 3  
Old 03-09-2020
Hi
try this workaround
Code:
eval cp path/to/files/{$first..$last}.dat ./

# 4  
Old 03-09-2020
... or a loop, that correctly handles special characters in file names, and can verify that the files exist:
Code:
for (( i=1; i<=10; i++ )); do
  f=/path/to/files/$i.dat
  [ -f "$f" ] && cp "$f" ./
done

# 5  
Old 03-09-2020
Hi, @MadeInGermany
Then it will meet the condition of the task
Code:
for (( i=first; i<=last; i++ )); do
  f=/path/to/files/$i.dat
  [ -f $f -a ! -f $i.dat ] && cp $f ./
done

But closer to me is such a solution
Code:
cp path/to/files/[$first-$last].dat ./

Here I got excited. This is correct if the file numbers are in the range 0-9

Last edited by nezabudka; 03-09-2020 at 06:54 AM..
# 6  
Old 03-09-2020
Hi.

Brace expansion with variables will work correctly with ksh and zsh ... cheers, drl

On a system like:
Code:
OS, ker|rel, machine: Linux, 3.16.0-7-amd64, x86_64
Distribution        : Debian 8.11 (jessie) 
ksh 93u+
zsh 5.0.7

# 7  
Old 03-09-2020
Good to know. Bash was first with brace expansion, now ksh and zsh are ahead. Let's see when bash will catch up again.
BTW, Bash-4 has got a number + field alignment expansion:
Code:
echo {01..10}
01 02 03 04 05 06 07 08 09 10

that ksh-93 has NOT:
Code:
echo {01..10}
1 2 3 4 5 6 7 8 9 10

zsh has got it even with variables:
Code:
zsh$ first=1
zsh$ last=10
zsh$ echo {$first..$last}
1 2 3 4 5 6 7 8 9 10
zsh$ first=01
zsh$ echo {$first..$last}
01 02 03 04 05 06 07 08 09 10

This User Gave Thanks to MadeInGermany For This Post:

Previous Thread | Next Thread
Test Your Knowledge in Computers #346
Difficulty: Easy
AWK was created at Bell Labs in the 1960s,
True or False?

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

How to create files with two or more variables in its names?

Hi all, Iam writing a perl script to create many files with variables in their name. i am able to do it, if iam using only one variable. But with two variables the file names are NOT getting generated in the way i want. plz help me out. 1. open(SHW,">divw_unsigned_50_50_$k.reset") or die... (4 Replies)
Discussion started by: twistedpair
4 Replies

2. Shell Programming and Scripting

Deleting particular files with a numerical suffix

Hello I have a directory with a list of files which have a particular numerical suffix. E.g filename_0 filename_1 filename_18500 filename_10000 I want to delete all files from this directory which have a filename which have a numerical suffix greater than 10540. So any files... (5 Replies)
Discussion started by: kamal_p_99
5 Replies

3. UNIX for Dummies Questions & Answers

List files according to the numerical value

Hi, I have a large number of files which are named as follows. VF_50, VF_100, VF_150, VF_250, VF_300, VF_350, VF_400, VF_450, VF_500. When I do an 'ls' it arranges the files in the following way VF_100, VF_150, VF_250, VF_300, VF_350, VF_400, VF_450, VF_50, VF_500. Is there a way to... (2 Replies)
Discussion started by: lost.identity
2 Replies

4. Shell Programming and Scripting

Finding File Names Ending In 3 Random Numerical Characters

Hi, I have a series of files (upwards of 500) the filename format is as follows CC10-1234P1999.WGS84.p190 each of this files is in a directory named for the file but excluding the extension. Now the last three numeric characters, in this case 999, can be anything from 001 to 999, I need to... (3 Replies)
Discussion started by: roche.j.mike
3 Replies

5. Shell Programming and Scripting

how to copy files followed by list of names of all the files in /etc?

....... (2 Replies)
Discussion started by: pcbuilder
2 Replies

6. UNIX for Dummies Questions & Answers

How can i copy a list of files with different names into others directory have the same name?

dear all. how can i copy a list of files with different names into others directory have the same name like i have 3 files 10_10 10_10_11 10_10_11_12 and i have 3 directories 10_10 10_10_11 10_10_11_12 how can i make a loop to cp this files into the directory have the same name like... (31 Replies)
Discussion started by: t17
31 Replies

7. Shell Programming and Scripting

how can i copy a list of files with different names into others directory have the same name

dear all. how can i copy a list of files with different names into others directory have the same name like i have 3 files 10_10 10_10_11 10_10_11_12 and i have 3 directories 10_10 10_10_11 10_10_11_12 how can i make a loop to cp this files into the directory have the same name like... (0 Replies)
Discussion started by: t17
0 Replies

8. Shell Programming and Scripting

compare files by numerical value

Hi everyone, I would love to have a script that does the following: I have one file that looks like that: ATOM 1 BB SER 1 1 -31.958 -25.125 -11.061 1.00 0.00 ATOM 3 BB GLY 1 2 -32.079 -26.085 -14.466 1.00 0.00 ATOM 4 BB VAL 1 3 ... (1 Reply)
Discussion started by: s-layer
1 Replies

9. Programming

Adding files of numerical data

Hi I was hoping that maybe someone could help me with a small piece of C code. I have a number of files, which are all of similar layout ie. three lines of text and 5-6 columns of numerical data. I need to add each of the elements of the second column in one file to their counterparts in the second... (17 Replies)
Discussion started by: Boucho
17 Replies

10. UNIX for Advanced & Expert Users

copy files with invalid names

Hi all, I have to copy a directory to another location. While doing so with the cp command I got some errors due to invalid filenames of some files. For example, some files have a colon in their names, which is throwing error. These files are not copied to the destination. How to copy... (1 Reply)
Discussion started by: fermisoft
1 Replies

Featured Tech Videos