所以,我有以下结构:
.
..
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:
这可以也做xargs
和sed
改变文件扩展名。
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
这做了三两件事:
- 找到名为* .svg.png这个目录下的文件,将-print0打印到标准输出
- SED修改标准输出,基本上交换.svg.png什么也没有,所以我会得到:文件1 /文件2 /文件3 /文件4
- 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