Character bar before period If file name has a prefix in Bash

I have a directory that looks like this:

pages/
    folder1/
        folder1.filename1.txt
        folder1.filename2.txt
    folder2/
        folder2.filename4.txt
        folder2.filename5.txt
    folder3/
        filename6.txt

I want it to look like this:

pages/
    folder1/
        filename1.txt
        filename2.txt
    folder2/
        filename3.txt
        filename4.txt
    folder3/
        filename5.txt

With ls * | sed -e s/^[^.]*.// > /tmp/filenames.txtI get a file containing:

filename1.txt
filename2.txt
filename3.txt
filename4.txt
txt

How can I tell sed to ignore form file names [filename].[suffix]and only look at form file names [foldername].[filename].[suffix]?

The final script (as indicated, the find command will simplify everything, but it worked):

for folder in $(ls .)
do
    if test -d $folder
    then
        pushd $folder
                ls * | sed 's/.*\.\(.*\..*\)/\1/' > /tmp/filenames.txt
                ls * > /tmp/current.txt

                exec 3</tmp/current.txt
                exec 4</tmp/filenames.txt

                while read file <&3; read name <&4;
                do
                    mv "$file" "$name"
                done

                rm /tmp/current.txt
                rm /tmp/filenames.txt
        popd
    else
        echo $folder "not a directory"
    fi
done

exit 0

This page is now a wiki community. You can add more elegant solutions below:

for folder in $(ls .)
do 
     something better
+3
source share
3 answers

Try:

sed 's/.*\.\(.*\..*\)/\1/'

find, "-d " execs while.

:

while read line
do
    echo $line
done < <(ls)

: Perl script, rename prename, .

+3

sed:

ls * > /tmp/current.txt
exec 3</tmp/current.txt
while read file <&3;
do
    replacement=${file#${folder}.}
    if [ "$replacement" != "txt" ] ; then
        mv "$file" "$replacement"
    fi
done
+2

:

/\A(.\*?\\.){2,2}.+\Z/
0

Source: https://habr.com/ru/post/1722981/


All Articles