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

时间:2015-06-23 17:59:34

标签: bash scripting

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

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

实施例: 文件包含以下行:

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

我需要使用子串“11854 - 埃及”并用它重命名该文件,然后继续下一个文件。

3 个答案:

答案 0 :(得分:0)

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

对于脚本打开文件并根据逻辑提取String a。

关闭文件并使用rename命令将文件名作为此脚本的输入。

重命名$ 0 .txt

如果文件结构是recurrrsive,则在最后一个/使用string方法的索引之前提取名称。

答案 1 :(得分:0)

看起来sed可能是工作的工具:

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

我将$j的测试视为空或已存在作为安全措施;你可能会想到别人。我还将-v标记给mv,以便您可以看到它正在做什么。

您可能更喜欢使用sed -n,只需对匹配PROBLEM:的行进行操作,如果这比使用第二行更可靠。

答案 2 :(得分:0)

  

来自每个文件

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

读取第二行[和]提取放在[括号]

之间的第一个子串
v=$(sed -n '2 { s/[^(]*(\([^)]*\)).*/\1/; p; q }' < "${f}")
  

重命名该文件

使用mv命令。