在命令行和Xargs中批量重命名文件

所以,我有以下结构:

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

我跑了一个命令来调整它们的大小

 ls | xargs -I xx convert xx -resize xx.jpg 

现在我的目录看起来像这样

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

第一个问题是,我如何重命名文件,以便我可以只有一个扩展名。 不是两个。 (基本上,我怎么清理我原来的错误)?

第二个问题是,在将来使用xargs时,如何将文件的扩展名更改为第二个命令?

我如何重命名文件,以便我可以只有一个扩展名。

 cd dir/with/messedup/files for file in *.png.jpg; do mv "$file" "${file%.png.jpg}.jpg" done 

在将来,使用xargs,如何将文件的扩展名更改为第二个命令?

据我所知,这是不能做到的。 最好的办法是使用一个带有参数替代的for循环,就像上面那样:

 for file in *.png; do convert "$file" -resize "${file%.png}.jpg" done 

如果你有要转换的子目录中的文件,那么你可以通过管道find一段while read循环:

 find . -type f -name '*.png' | while read file; do convert "$file" -resize "${file%.png}.jpg" done 

注意:在shell脚本中使用ls的输出通常被认为是一个坏主意 。 虽然你的例子可能工作得很好,但有很多例子没有。 例如,如果你的文件名碰巧在其中有新行(这是unix允许的), ls可能不会为你逃脱。 (这实际上取决于你的实现,这是在脚本中不使用ls另一个原因;从一个盒子到另一个盒子的行为差别很大)。如果你在while循环中使用find ,文件globbing(例如*.png )在for循环中。

这也可以用xargssed来改变文件的扩展名。

 ls | grep \.png$ | sed 'p;s/\.png/\.jpg/' | xargs -n2 mv 

您可以打印原始文件名以及您想要的文件名。 然后让xargs在移动命令中使用这两个参数。 对于单线程,我还添加了一个grep来过滤掉任何不是* .png文件的东西。

晚会晚了,但这里是如何用xargs重命名文件。 假设你有一堆名为fileN.svg.png的文件,你想命名为fileN.png,其中N可以是一系列整数:

ls *.svg.png | xargs basename -s .svg.png | xargs -I {} mv {}.svg.png {}.png

第一个xargs使用basename去除.svg .png以获得一个正确的filenameN N. 第二个xargs接收该名称,并使用替换来重命名该文件。

要清理错误,请尝试rename实用程序。 检查详细信息的联机帮助页。

在你的情况下,如果你的当前目录设置得当,你会rename '.png.jpg' '.jpg' ./*

既然你有convert可用,我假设你也有mogrifyimagemagick套件)。 每当我想这样做,我复制文件到一个不同的目录,而不是使用mogrify 。 我通常只需要这个来调整大小,但是如果你也改变图像格式, mogrify会处理文件名(使用合适的文件名创建新文件)。

你可以用它作为mogrify -format jpg -resize [size] ./*.png 。 我不确定没有几何参数应该做什么。 它没有记录,也不能在我的机器上工作。

正如Tim Pote所说,我不认为你可以让xargs分别处理文件名和扩展名。

我参加了这个晚会已经有3年了,我也遇到了类似的问题。 我有一个使用Inkscape转换的png文件列表,因为ImageMagick的svg支持很差。

我原来是这样做的,

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

这当然导致了像上面发布的相同的问题。

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

我想把* .svg.png重命名为* .png,这就是我最后的结果。

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

这有三件事情:

  1. 在这个目录中找到名为* .svg.png的文件,-print0打印到标准输出
  2. sed修改标准输出,基本上没有任何东西交换.svg.png,所以我会得到:file1 / file2 / file3 / file4
  3. xargs -0从sed获取数据,-I引用文件名w / o扩展名,然后mv原始文件名到新文件名。 namePrefix这个词不是什么特别的,只是想说清楚。

编辑

我意识到现在这是做这件事情最复杂的方式。 可以简单地使用重命名命令。

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