How to use sed to change file extensions?

前端 未结 6 707
粉色の甜心
粉色の甜心 2021-01-01 06:33

I have to do a sed line (also using pipes in Linux) to change a file extension, so I can do some kind of mv *.1stextension *.2ndextension like mv *.txt *.

相关标签:
6条回答
  • 2021-01-01 07:08

    This may work:

    find . -name "*.txt" | 
    sed -e 's|./||g' | 
    awk '{print "mv",$1, $1"c"}' | 
    sed -e "s|\.txtc|\.c|g" > table;
    chmod u+x table;
    ./table
    

    I don't know why you can't use a loop. It makes life much easier :

    newex="c";  # Give your new extension
    for file in *.*;  # You can replace with *.txt instead of *.*
    do 
     ex="${file##*.}";    # This retrieves the file extension
     ne=$(echo "$file" | sed -e "s|$ex|$newex|g"); # Replaces current with the new one
     echo "$ex";echo "$ne";
     mv "$file" "$ne";
    done
    
    0 讨论(0)
  • 2021-01-01 07:08

    You may try following options

    Option 1 find along with rename

    find . -type f -name "*.ext1" -exec rename -f 's/\.ext1$/ext2/' {} \;
    

    Option 2 find along with mv

    find . -type f -name "*.ext1" -exec sh -c 'mv -f $0 ${0%.ext1}.ext2' {} \;
    

    Note: It is observed that rename doesn't work for many terminals

    0 讨论(0)
  • 2021-01-01 07:15

    You can use find to find all of the files and then pipe that into a while read loop:

    $ find . -name "*.ext1" -print0 | while read -d $'\0' file
    do
       mv $file "${file%.*}.ext2"
    done
    

    The ${file%.*} is the small right pattern filter. The % marks the pattern to remove from the right side (matching the smallest glob pattern possible), The .* is the pattern (the last . followed by the characters after the .).

    The -print0 will separate file names with the NUL character instead of \n. The -d $'\0' will read in file names separated by the NUL character. This way, file names with spaces, tabs, \n, or other wacky characters will be processed correctly.

    0 讨论(0)
  • 2021-01-01 07:19

    you can use string manipulation

    filename="file.ext1"
    mv "${filename}" "${filename/%ext1/ext2}"
    

    Or if your system support, you can use rename.

    Update

    you can also do something like this

    mv ${filename}{ext1,ext2}
    

    which is called brace expansion

    0 讨论(0)
  • 2021-01-01 07:25

    sed is for manipulating the contents of files, not the filename itself. My suggestion:

    rename 's/\.ext/\.newext/' ./*.ext
    

    Or, there's this existing question which should help.

    0 讨论(0)
  • 2021-01-01 07:28

    Another solution only with sed and sh

    printf "%s\n" *.ext1 | 
    sed "s/'/'\\\\''/g"';s/\(.*\)'ext1'/mv '\''\1'ext1\'' '\''\1'ext2\''/g' | 
    sh
    

    for better performance: only one process created

    perl -le '($e,$f)=@ARGV;map{$o=$_;s/$e$/$f/;rename$o,$_}<*.$e>' ext2 ext3
    
    0 讨论(0)
提交回复
热议问题