我有很多这样的目录:
./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 文件的目录。
- 然后我们保留信息直到前两个点并构建新的文件名。
- 这假设你
rename
是perl-rename
.基于 Debian 的系统有perl-rename
asrename
,其他系统可能有 asperl-rename
或prename
。