Krøllebølle
Krøllebølle

Reputation: 3028

Copy single file to all matching files after changing filename pattern in bash

I have a folder containing a set of cs*.dat3 files like this:

$ find dispersion_upper_deck/ -name cs*.dat3
dispersion_upper_deck/cs600011.dat3
dispersion_upper_deck/Runs652/cs652203.dat3
dispersion_upper_deck/Runs652/cs652103.dat3
dispersion_upper_deck/Runs652/cs652204.dat3
dispersion_upper_deck/Runs652/cs652104.dat3
dispersion_upper_deck/Runs654/cs654404.dat3
dispersion_upper_deck/Runs654/cs654403.dat3

Now, for each of these files I want to replace them with a corresponding co*.dat3 file that will be copied from a base file named co_base_dispersion. Doing it manually, I could for example do cp co_dispersion_base dispersion_upper_deck/Runs652/co652203.dat3 for each file, but I want something that is more automated. I tried the following:

$ for cs_file in $(find dispersion_upper_deck/ -name cs*.dat3); do cp -v co_base_dispersion $(dirname $cs_file)/$(basename $cs_file) | sed "s/cs/co/"; done
`co_base_dispersion' -> `./dispersion_upper_deck/co600011.dat3'
`co_base_dispersion' -> `./dispersion_upper_deck/Runs652/co652203.dat3'
`co_base_dispersion' -> `./dispersion_upper_deck/Runs652/co652103.dat3'
`co_base_dispersion' -> `./dispersion_upper_deck/Runs652/co652204.dat3'
`co_base_dispersion' -> `./dispersion_upper_deck/Runs652/co652104.dat3'
`co_base_dispersion' -> `./dispersion_upper_deck/Runs654/co654404.dat3'
`co_base_dispersion' -> `./dispersion_upper_deck/Runs654/co654403.dat3'

Now, the output from cp -v looks correct, but nothing happens:

find dispersion_upper_deck/ -name co*.dat3
$ 

What could be wrong here?

Upvotes: 0

Views: 82

Answers (1)

user3442743
user3442743

Reputation:

This should work, i havent had time to test it though so just let me know if something goes wrong.

for cs_file in $(find dispersion_upper_deck/ -name cs*.dat3); do 
    Filename=$(basename $cs_file | sed "s/cs/co/") 
    cp -v co_base_dispersion $(dirname $cs_file)/$Filename
done

or Krøllebølles solution without the $Filename variable.

for cs_file in $(find dispersion_upper_deck/ -name cs*.dat3); do 
    cp -v co_base_dispersion $(dirname $cs_file)/$(basename $cs_file | sed "s/cs/co/")
done

Upvotes: 1

Related Questions