Search code examples
shellfile-handlingfind-replace

Find and replace for loop shell


Using the below command my script excutes succesfully.

for file in collectorlist*  ; do mv "$file" "${/bak_/{file}}" ; done 

Now i want to move the bak_{file} to {file} to which is resetting to the original file name. i tried the below way , throws an error., your suggestion is appreciated.

for file in bak_collectorlist*; do mv "$file" "${/bak_/{file}}" ; done 

Solution

  • Use:

    for file in bak_collectorlist*; do mv "$file" "${file/bak_/}" ; done
    

    From bash man:

    ${parameter/pattern/string} Pattern substitution

    The pattern is expanded to produce a pattern just as in pathname expansion. Parameter is expanded and the longest match of pattern against its value is replaced with string. If pattern begins with /, all matches of pattern are replaced with string. Normally only the first match is replaced. If pattern begins with #, it must match at the beginning of the expanded value of parameter. If pattern begins with %, it must match at the end of the expanded value of parameter. If string is null, matches of pattern are deleted and the / following pattern may be omitted. If parameter is @ or *, the substitution operation is applied to each positional parameter in turn, and the expansion is the resultant list. If parameter is an array variable subscripted with @ or *, the substitution operation is applied to each member of the array in turn, and the expansion is the resultant list

    .

    Demo

    $ ll bak_collectorlist*
    -rw-r----- 1 klashxx klashxx 2 Jun 19 09:13 bak_collectorlist
    -rw-r----- 1 klashxx klashxx 2 Jun 19 09:13 bak_collectorlist2
    $
    $ for file in bak_collectorlist*;do echo "$file" "${file/bak_/}" ; done
    bak_collectorlist collectorlist
    bak_collectorlist2 collectorlist