根据内容

时间:2017-10-17 13:07:29

标签: bash grep macos-sierra

在macOS Sierra(v.10.12.6)中,我有一个包含许多平面文本(.txt)文件的目录。每个文件都有一个无用的名称,例如“无标题文本252.txt”。我想知道是否可以基于位于每个文件第一行的代码以编程方式重命名每个文件。

每个文件都以节符号(§),空格,始终包含句点(.)的代码和空格开头。代码通常只是数字,但偶尔也会有一个后跟连字符(-)后跟一个字母。例如:'§ 177.30 ''§ 60.10-a '

我想根据代码重命名每个文件,但首先重新格式化代码。简而言之,为P添加前缀,从代码中删除句点,并添加尾随.txt。使用上面的示例,文件名将是:P17730.txtP6010-a.txt

在命令提示符下,我已经找到了如何从每个文件中grep代码:

grep -o '^§ [A-Za-z0-9]*\.[A-Za-z0-9\-]* ' *.txt

这将返回从节符号到尾随空格的所有内容(例如'§ 130.65-a ')。

所以,剩下的问题是:

  1. 如何将grep结果重新格式化为我想要的文件名(例如P13065-a.txt);和,
  2. 如何将文件重命名操作与grep?
  3. 组合使用

2 个答案:

答案 0 :(得分:2)

您可以使用sed仅从第一行中提取数字(删除所有非数字):

$ sed -n '1 {s/[^0-9]//g; p;}' <<<"§ 177.30 "
17730

然后find所有*.txt个文件,提取数字,并重命名为P<digits>.txt。而不是就地重命名,将文件复制到目标目录更安全:

$ mkdir -p /path/to/targetdir
$ find . -name '*.txt' -exec bash -c 'digits=$(sed -n "1{s/[^0-9]//g;p;}" "$1"); cp "$1" "/path/to/targetdir/$newname"' _ {} \;

执行简短的bash脚本:

#!/bin/bash
digits=$(sed -n "1{s/[^0-9]//g;p;}" "$1")
cp "$1" "/path/to/targetdir/$newname"

find找到的每个文件(并作为第一个位置参数$1)。

答案 1 :(得分:1)

find . -maxdepth 1 -regex '[^P].*\.txt' -exec \
    sed -n "1 s|§ \([0-9]*\)\.\([0-9a-z-]*\) |mv '{}' P\1\2.txt|p" '{}' \
    \;

生成一个像

这样的shell脚本
mv './file.txt' P6010-a.txt

您可以通过附加| sh

来查看和执行