2016-05-20 155 views
-3

我将在Linux中的文件夹中重命名图像文件和pdf文件。Linux批量重命名文件

它应该是递归的,因为有些文件位于子子文件夹中。

当前文件名模式是这样的:

an-yt-h-in-g-123word-123456-anything.jpg (.png .pdf) 

我的目标模式是

123456-anything.jpg (.png .pdf) 

在很短的,我想-NumberString-之前删除一切,让一切之后(包括NumberString) 。

任何人都可以帮忙吗?非常感谢

+1

您是否阅读过[tag:batch-file]的标签信息?我假设你不知道它与Windows有关,否则... – aschipfl

+0

感谢您接受它。我输入“批处理”,它会自动提出批处理文件,这是一个错误。 – user1982312

回答

0

该命令将检查最后一个“数字串”的位置,并从该位置输出子串到最后。您可以将ls命令更改为其他内容。

ls | awk -F '-' '{ for(i=NF; i>=0; i--) { if (match($i, /^[0-9]+$/)) { print $i; for (j=i+1; j<=NF; j++){ printf "-%s" ,$j }; print "\n" } } }' $1 ORS=""

1

如果像你说的所有的文件都严格命名,你可以使用命令

echo $s | awk -F'-' '{printf "%s-%s", $5, $6}' 

获得新的名称,假设原来的文件名由s举行。

改名可以简单地mv做像

mv $s $(echo $s | awk -F'-' '{printf "%s-%s", $5, $6}') 

其中s是原来的文件名也。

+0

谢谢PJ。我没有解释清楚。当前文件名称模式可以是任意长度。它就像x-x-x-x-x-x-x-x-x-xxxx-123456-xxxxx.jpg。 – user1982312

+1

无论连字符的数量如何,最后的2个字段都是'awk -F'-''{printf“%s-%s”,$(NF-1),$(NF)}' – indiv

+0

Right,@indiv'我的回答比我的好。 –

0

一个-YT-H-在-G-123word-123456-anything.jpg

对于JPEG文件的平坦目录:

rename 's/.*-[0-9]+-[A-Za-z]+\./\1-\2/.' *.jpg 

对于递归访问当前目录:

find . \(-name "*.jpg" -o -name "*.pdf" \) -exec rename 's/.*-[0-9]+-[A-Za-z]+\./\1-\2/.' {} ";"