简体   繁体   中英

Bash Rename Files Script Not Working

I have the following script and for some reason it is not working

find . -name '*---*' | while read fname3 

do
    new_fname3=`echo $fname3 | tr "---" "-"`

    if [ -e $new_fname3 ]
    then
            echo "File $new_fname3 already exists. Not replacing $fname3"
    else
            echo "Creating new file $new_fname3 to replace $fname3"
            mv "$fname3" $new_fname3
    fi

done

However if I use

find . -name '*---*' | while read fname3 

do
    new_fname3=`echo $fname3 | tr "-" "_"`

    if [ -e $new_fname3 ]
    then
            echo "File $new_fname3 already exists. Not replacing $fname3"
    else
            echo "Creating new file $new_fname3 to replace $fname3"
            mv "$fname3" $new_fname3
    fi

done

The script works but I end up with 3 underscores " _ " how can I replace the 3 dashes "---" with a single dash?

Thanks,

Have a look at man tr . tr will just replace single characters.

Use something like perl -wpe "s/---/-/" instead.

Also have a look at man 1p rename . It is doing pretty much exactly what you want:

rename 's/---/-/' *---*

I believe you need to change the tr for a sed substitution:

tr '---' '-' should be changed to sed -e 's/---/-/g

As an example of the difference:

$ echo "a---b" | tr '---' '-'
tr: unrecognised option '---'
try `tr --help' for more information

$ echo "a---b" | sed -e 's/---/-/g'
a-b

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM