Bash 脚本,从目录中的一组文件中读取

Bash script, reading from set of files in a directory

我在一个目录中放置了一组文件,我想从每个文件中读取第二行,提取放在大括号“ () ” 之间的第一个子字符串,并用这个替代重命名该文件。

我不是在寻找完整的 bash 代码,我只需要一些提示和命令用于每个步骤

示例: 一个文件有这些行:

/* USER: 202166 (just_yousef) */
/* PROBLEM: 2954 (11854 - Egypt) */
/* SUBMISSION: 11071978 */
/* SUBMISSION TIME: 2012-12-25 15:49:25 */
/* LANGUAGE: 3 */

我需要获取子字符串“11854 - Egypt”并用它重命名文件,然后继续下一个文件。

对目录中的每个使用与 xargs 相同的管道并过滤您要读取的文件。并将带有路径的文件名传递给将读取第二行的脚本。

对于脚本,打开文件并按照逻辑提取字符串 a。

然后关闭文件并使用重命名命令重命名您作为此脚本输入的文件名。

重命名 $0 .txt

如果文件结构是递归的,则提取最后一个之前的名称/使用字符串方法的索引。

看起来 sed 可能是完成这项工作的工具:

for i in *
do
    j=`sed -e '1d;2{;s/.*(\(.*\)).*//;q;}' "$i"`
    test -z "$j" || test -e "$j" || mv -v "$i$ "$j"
done

我把 $j 空的或已经存在的测试作为保障措施;你可能会想到其他人。我还把 -v 标志给了 mv 这样你就可以看到它在做什么。

您可能更喜欢使用 sed -n 并且只对匹配 PROBLEM: 的行执行操作,如果这比始终使用第二行更可靠的话。

from each file

for f in /the/directory/*; do
  # ...
done

read the second line [and] extract the first substring which is placed between [parentheses]

v=$(sed -n '2 { s/[^(]*(\([^)]*\)).*//; p; q }' < "${f}")

rename that file

使用mv命令。