在macOS Sierra(v.10.12.6)中,我有一个包含许多平面文本(.txt)文件的目录。每个文件都有一个无用的名称,例如“无标题文本252.txt”。我想知道是否可以基于位于每个文件第一行的代码以编程方式重命名每个文件。
每个文件都以节符号(§
),空格,始终包含句点(.
)的代码和空格开头。代码通常只是数字,但偶尔也会有一个后跟连字符(-
)后跟一个字母。例如:'§ 177.30 '
或'§ 60.10-a '
。
我想根据代码重命名每个文件,但首先重新格式化代码。简而言之,为P
添加前缀,从代码中删除句点,并添加尾随.txt
。使用上面的示例,文件名将是:P17730.txt
和P6010-a.txt
。
在命令提示符下,我已经找到了如何从每个文件中grep代码:
grep -o '^§ [A-Za-z0-9]*\.[A-Za-z0-9\-]* ' *.txt
这将返回从节符号到尾随空格的所有内容(例如'§ 130.65-a '
)。
所以,剩下的问题是:
P13065-a.txt
);和,答案 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