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

Cri*_*pto 26 unix linux shell command-line xargs

所以,我有以下结构:

.
..
a.png
b.png 
c.png
Run Code Online (Sandbox Code Playgroud)

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

ls | xargs -I xx convert xx -resize xx.jpg
Run Code Online (Sandbox Code Playgroud)

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

.
..
a.png.jpg
a.png
b.png.jpg
b.png
c.png.jpg
c.png
Run Code Online (Sandbox Code Playgroud)

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

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

Sch*_*eis 52

这也可以通过xargssed更改文件扩展名来完成.

ls | grep \.png$ | sed 'p;s/\.png/\.jpg/' | xargs -n2 mv
Run Code Online (Sandbox Code Playgroud)

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

  • 如果路径包含空格,这是否有效?我不这么认为.`找到.-name"*.png"-print0 | sed'p; s /\.png /\.jpg /'| 我认为xargs -0 -n2 mv`更好. (6认同)
  • 美丽的!不知道“sed 'p'”也不知道“xargs -n2”。 (4认同)
  • 我会从“...”开始 xargs -0 -n2 首先 echo mv`,然后继续执行 `... | xargs -0 -n2 mv` 如果结果正确。 (2认同)
  • @CervEd 并非所有系统都有“重命名”,并且并非所有系统都有相同的“重命名” (2认同)

Tim*_*ote 22

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

cd dir/with/messedup/files

for file in *.png.jpg; do
  mv "$file" "${file%.png.jpg}.jpg"
done
Run Code Online (Sandbox Code Playgroud)

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

据我所知,这是不可能完成的.最好的方法是使用带有参数替换的for循环,就像上面那样:

for file in *.png; do
  convert "$file" -resize "${file%.png}.jpg"
done
Run Code Online (Sandbox Code Playgroud)

如果您想要转换子目录中的文件,那么您可以管道findwhile read循环:

find . -type f -name '*.png' |
while read file; do
  convert "$file" -resize "${file%.png}.jpg"
done
Run Code Online (Sandbox Code Playgroud)

注意:在shell脚本中使用输出通常被认为是个坏主意ls.虽然你的例子可能运行良好,但有很多例子没有.例如,如果您的文件名恰好有新行(unix允许),那么ls可能无法逃脱.(这实际上取决于你的实现,这是不在ls脚本中使用的另一个原因;它的行为在一个盒子到另一个盒子之间变化很大.)如果你find在while-read循环或文件globbing中使用,你会得到更一致的结果(例如*.png)在for循环中.

  • 我认为将'find`换成'while`循环是天才,我以前从未见过它. (5认同)

小智 11

迟到了,但这里是你如何用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来获得一个just filenameN.第二个xargs接收该裸名称并使用replacement来重命名该文件.


Mat*_*tej 6

要清除错误,请尝试该rename实用程序.查看联机帮助页以获取详细信息

在您的情况下,rename '.png.jpg' '.jpg' ./*如果您正确设置了当前目录,则会执行此操作.

既然你convert有空,我假设你也有mogrify(imagemagick套房).每当我想这样做时,我会将文件复制到另一个目录中并使用mogrify.我通常只需要调整大小,但如果更改图像格式,mogrify则会处理文件名(使用正确的文件名创建新文件).

你会用它作为mogrify -format jpg -resize [size] ./*.png.我不确定-resize没有几何参数应该做什么.它没有记录,也不适用于我的机器.

正如Tim Pote推论的那样,我认为你不能让xargs单独处理文件名和扩展名.


Pau*_*l J 5

我参加这个聚会迟到了大约三年,我遇到了一个类似的问题,我自己弄清楚了。我有一个使用inkscape转换的png文件列表,因为ImageMagick的svg支持很差。

我最初通过执行以下操作来转换它们:

find . -name "*.svg" -exec inkscape {} --export-png={}.png
Run Code Online (Sandbox Code Playgroud)

当然,这导致了与上述问题相同的问题。

file1.svg
file1.svg.png
file2.svg
file2.svg.png
file3.svg
file3.svg.png
file4.svg
file4.svg.png
Run Code Online (Sandbox Code Playgroud)

我想将* .svg.png重命名为* .png,这就是我最后想到的...

find . -name "*.svg.png" -print0 | sed 's/.svg.png//g' | xargs -0 -I namePrefix mv namePrefix.svg.png namePrefix.png
Run Code Online (Sandbox Code Playgroud)

这做三件事:

  1. 在此目录中找到名为* .svg.png的文件,-print0打印到标准输出
  2. sed修改了标准输出,基本上什么都没有交换.svg.png,所以我得到:file1 / file2 / file3 / file4
  3. xargs -0从sed获取数据,-I引用不带扩展名的文件名,然后将mv原始文件名更改为新文件名。名称前缀这个词没什么特别的,只是想清楚一点。

编辑

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

rename 's/svg\.png/.png/' *
Run Code Online (Sandbox Code Playgroud)