根据目录名中的字符数重命名文件

根据目录名中的字符数重命名文件

我有很多这样的目录:

./lab-results.n3668.2017-01-16
./lab-results.n471.2017-02-24
./tests.n287.2017-01-28
./tests.n4501.2017-03-04

不幸的是,它们包含只有一个文件但名字是一样的。

./lab-results.n3668.2017-01-16/lab-results.pdf
./lab-results.n471.2017-02-24/lab-results.pdf
./tests.n287.2017-01-28/tests.pdf
./tests.n4501.2017-03-04/tests.pdf

我想在重命名后移动所有这些文件,如下所示:

./lab-results.n3668.pdf
./lab-results.n471.pdf
./tests.n287.pdf
./tests.n4501.pdf

所以,似乎我在那里看到了一些 sh ​​脚本,但我不知道如何采用目录名称字符的一部分来形成文件的未来名称。

lab-results.n9999 : max number available, will not change
tests.n9999 : max number

我也可能有其他目录,但其名称中总是后面跟着一堆数字:

./xxxxxxx.n9999
./yyyyyy.n9999
./zzz.n9999

非常感谢任何提示或帮助。我在 Linux 发行版上使用 bash 4.3.11(1)。

答案1

 for F in */* ; do echo mv "$F" "${F/.2017*/.pdf}" ; done

或作为脚本:

#! /bin/bash
for F in */*
do
    echo mv "$F" "${F/.2017*/.pdf}"
done

它只是显示它将做什么。如果这是您想要的,则删除echo并运行它。

诀窍在于。它在文件名+路径中${F/.2017*/.pdf}搜索并将其替换为。.2017*.pdf

答案2

rename 's|^(\./[^.]*\.[^.]*).*|$1.pdf|' ./*.*.*/*.pdf

  • 我们选择至少有 2 个点并包含 pdf 文件的目录。
  • 然后我们保留信息直到前两个点并构建新的文件名。
  • 这假设你renameperl-rename.基于 Debian 的系统有perl-renameas rename,其他系统可能有 asperl-renameprename

相关内容