Batch renaming files in command line and Xargs

后端 未结 9 717
余生分开走
余生分开走 2020-12-12 16:32

So, I have the following structure:

.
..
a.png
b.png 
c.png

I ran a command to resize them

ls | xargs -I xx convert xx -res         


        
9条回答
  •  [愿得一人]
    2020-12-12 17:21

    I'm late to this party by about 3 years, I just had a similar problem which I figured out myself. I had a list of png files which I converted using inkscape, because ImageMagick's svg support is poor.

    I originally converted them by doing:

    find . -name "*.svg" -exec inkscape {} --export-png={}.png
    

    Which of course led to the same issue like posted above.

    file1.svg
    file1.svg.png
    file2.svg
    file2.svg.png
    file3.svg
    file3.svg.png
    file4.svg
    file4.svg.png
    

    I wanted to rename *.svg.png to *.png, this is what I wound up with...

    find . -name "*.svg.png" -print0 | sed 's/.svg.png//g' | xargs -0 -I namePrefix mv namePrefix.svg.png namePrefix.png
    

    This does three things:

    1. find in this directory files named *.svg.png, the -print0 prints to standard output
    2. sed modifies the standard output, basically swap .svg.png with nothing, so I'd get: file1/file2/file3/file4
    3. xargs -0 to get the data from sed, -I references the filename w/o the extension, then mv original filename to new filename. The word namePrefix isn't anything special, just wanted to make it clear.

    EDIT

    I realize now this is the most convoluted way to do this. One can simply use the rename command.

    rename 's/svg\.png/.png/' *
    

提交回复
热议问题