在命令行和xargs的批量重命名文件(Batch renaming files in command

2019-06-25 10:17发布

所以,我有以下结构:

.
..
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的,我该如何更改文件的扩展名simular到第二个命令?

Answer 1:

如何重命名文件,这样我就可以有一个扩展。

cd dir/with/messedup/files

for file in *.png.jpg; do
  mv "$file" "${file%.png.jpg}.jpg"
done

在未来,使用xargs的,我该如何更改文件的扩展名simular到第二个命令?

据我所知,是无法做到的。 要做到这一点,最好的方法是使用一个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

注意:这通常被认为是一个坏主意使用的输出ls在shell脚本。 虽然你的例子可能会工作得很好,也有其不例子很多的。 举例来说,如果你的文件名发生在他们换行符(其中UNIX允许), ls可能不会逃避那些你。 (这实际上取决于具体的实现,这是另一个理由不使用ls在脚本;它的行为差异很大,从一分箱到下一个),你会得到更一致的结果,如果你要么使用find在一段时间读循环或文件通配符(如*.png的)for循环。



Answer 2:

这可以也做xargssed改变文件扩展名。

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

你可以用你想要的文件名是什么沿着打印原来的文件名。 然后有xargs的使用这些两个参数在移动命令。 对于一个内胆,我还加了grep来过滤掉任何东西不是一个* .png文件。



Answer 3:

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

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

第一xargs的使用基本名称脱光既.SVG .png得到公正filenameN 。 第二xargs的接收裸名称,并使用替代重命名文件。



Answer 4:

清理你的错误,请尝试rename工具。 详情请查阅手册页。

在你的情况,你会怎么做rename '.png.jpg' '.jpg' ./*如果当前目录设置为合适。

既然你有convert用,我假设你有mogrify太( imagemagick套件)。 每当我想这样做,我将文件复制到不同的目录,并使用mogrify代替。 我通常需要这只是调整大小,但如果你改变图像格式藏汉, mogrify将处理文件名(做出适当的文件名新文件)。

你可以使用它作为mogrify -format jpg -resize [size] ./*.png 。 我不知道什么-resize是应该做的,而不几何参数。 它不记录,并在我的机器不能正常工作。

蒂姆POTE理由,我不认为你可以做xargs的分别处理文件名和扩展名。



Answer 5:

我迟到了这个党通过3年左右,我只是我想通了自己类似的问题。 我有我使用Inkscape的,因为ImageMagick的SVG的支持很差转换的PNG文件的列表。

我本来转换他们这样做:

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什么也没有,所以我会得到:文件1 /文件2 /文件3 /文件4
  3. xargs的-0摆脱sed的数据,-I引用文件名W / O扩展,然后MV原始文件名新文件名。 这个词namePrefix没有什么特别的,只是想讲清楚。

编辑

我意识到现在这个是要做到这一点最令人费解的方式。 可以简单地使用重命名命令。

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


Answer 6:

我的解决方案类似于许多xarg的解决方案,特别是类似Schleis'。

这里的区别是一个完整的regex操作与之相匹配的引用,sed命令,妥善忽略不匹配,所以你不需要预过滤你的上市文件。

这也是用空格和shell元文件的安全。

改变\2在替换到任何所需的扩展。

ls |
sed -nE 's/Rick\.and\.Morty\.(S03E[0-9]{2})\..*(\.[a-z0-9]{3})/"&" "Rick and Morty \1\2"/;T;p' |
xargs -n 2 mv

说明

-n ARG诉说的SED不打印默认情况下的话,就是T命令说跳到脚本结束时,如果以前的s命令没有做替补, p命令打印模式空间(如果只打s命令火柴)。

&在替换是将原始文件名匹配的内容的参考。

如果我们更换mv与命令bash -c 'echo "run($#) $@"' bash这时我们可以看到的次数mv将被调用,并与参数个数和值:

$ ls |
  sed -nE 's/Rick\.and\.Morty\.(S03E[0-9]{2})\..*(\.[a-z0-9]{3})/"&" "Rick and Morty \1\2"/;T;p' |
  xargs -n 2 bash -c 'echo "run($#) $@"' bash
run(2) Rick.and.Morty.S03E02.720p.HDTV.x264-BATV.mkv Rick and Morty S03E02.mkv
run(2) Rick.and.Morty.S03E03.720p.HDTV.x264-BATV.mkv Rick and Morty S03E03.mkv
run(2) Rick.and.Morty.S03E04.720p.HDTV.x264-BATV.mkv Rick and Morty S03E04.mkv
run(2) Rick.and.Morty.S03E05.HDTV.x264-BATV[ettv].mkv Rick and Morty S03E05.mkv
run(2) Rick.and.Morty.S03E06.720p.HDTV.x264-BATV.mkv Rick and Morty S03E06.mkv
run(2) Rick.and.Morty.S03E06.HDTV.x264-BATV.mkv Rick and Morty S03E06.mkv
run(2) Rick.and.Morty.S03E07.720p.HDTV.x264-BATV[ettv].mkv Rick and Morty S03E07.mkv
run(2) Rick.and.Morty.S03E08.720p.HDTV.x264-BATV.mkv Rick and Morty S03E08.mkv
run(2) Rick.and.Morty.S03E09.720p.HDTV.x264-BATV.mkv Rick and Morty S03E09.mkv
run(2) Rick.and.Morty.S03E10.720p.HDTV.x264-BATV.mkv Rick and Morty S03E10.mkv


Answer 7:

后在这里类似任务的一些调查是我的代码:

find . -maxdepth 1 -name '*.png' -print0 | sed 's/.png//g' | xargs -0 -I% -n 1 -P 8 convert -quality 100 %.png %.jpg

推理:

  • 重命名不会压缩文件(因此使用convert ,而不是mv
  • ls \.png$ | xargs ls \.png$ | xargs将不处理路径/文件名空间
  • find . 将在子文件夹进行搜索,所以用-maxdepth 1
  • convert不使用可用的CPU等等-P8 (或-P other
  • sed'g'在端部将不替换所有的文件(只有一个)
  • sed 's/.png//g'将离开没有扩展名(基名也可以工作,但之后并没有-print0
  • parallel -可能更好的解决方案,但在我的Ubuntu 18.04的bash 4.4没有工作
  • %是用于取代的最小共同符号(比较{} xx namePrefix
  • -n2参数有利于xargs ,但没有一起工作-print0正确( n参赛人数参加并通过后xargs
  • -quality 100默认魔质量为92(这是罚款),本文中的100%,以避免丢失任何东西


Answer 8:

我试图从: https://www.tecmint.com/linux-image-conversion-tools/

ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.png}.jpg"'

使用并行

parallel convert '{}' '{.}.jpg' ::: *.png


Answer 9:

find ./xx -name "*.png" -print0 |sed 's/.png$//g'|xargs -0 -I% mv %.png %.jpg



文章来源: Batch renaming files in command line and Xargs