![如何使用 Bash 脚本通过 grep 移动和重命名文件](https://linux22.com/image/146115/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20Bash%20%E8%84%9A%E6%9C%AC%E9%80%9A%E8%BF%87%20grep%20%E7%A7%BB%E5%8A%A8%E5%92%8C%E9%87%8D%E5%91%BD%E5%90%8D%E6%96%87%E4%BB%B6.png)
您好,我有一个名为 Input 的 FTP 文件夹,我在其中收到发送的文件,如下所示:
"Guide to Iceland _ Chen-ping Wang itinerary T-987654987.pdf"
"Guide to Iceland _ T-123654875 Chen-ping Wang itinerary.pdf"
基本上,文件的描述可以不同,但它总是包含“T-”和一些数字。
我需要创建一个 bash 脚本,将文件复制到文件夹 ../Output 并重命名该文件,以便“T-”和数字首先出现,然后是文件名的其余部分。例子:"T-123654875 - Guide to Iceland _ Chen-ping Wang itinerary.pdf"
我打算使用 Grep 来获得正确的名称。搜索(.+)(T-\d+)
并替换为$2 - $1
但我无法让它正常工作。
答案1
grep
单独和替换对我来说看起来不像是一个可用的组合。你对这个怎么看sed
?
$ ls *pdf
Guide to Iceland _ Chen-ping Wang itinerary T-987654987.pdf
Guide to Iceland _ T-123654875 Chen-ping Wang itinerary.pdf
然后是一个小 for 循环bash
:
$ for i in *pdf; do mv "$i" "$( echo $i | sed -r 's/^(.*)(T-[0-9]{9})(.+)$/\2 - \1\3/' )"; done
这会迭代当前目录中的所有 PDF;为每次迭代存储它们的名称$i
,通过 sed 回显内容(并使用其输出作为 的目标mv
)。sed
将文件名分成三部分并重新排列。我建议替换mv
为echo mv
进行测试:)
这给了我们:
$ ls *pdf
T-123654875 - Guide to Iceland _ Chen-ping Wang itinerary.pdf
T-987654987 - Guide to Iceland _ Chen-ping Wang itinerary .pdf