创建控制名称的文件

时间:2016-01-03 17:17:14

标签: linux bash loops

我有 n 个文件,名为 f1 f2 ,..., fn 。对于每个文件,我必须执行sed命令,并将新文件命名为 file1 file2 ,..., filen

我需要新文件保持与原始文件相同的数字。有人可以帮忙吗?

这是我到目前为止所尝试的内容:

#!/bin/sh 

for element in *
do 
    echo "$element" sed -n '/Col3/p' $element > Quest $element 
done

2 个答案:

答案 0 :(得分:1)

如果我们假设您的所有文件都在您的问题中?

$ ls -l
total 2
-rw-r--r--  1 ghoti  wheel  0 Jan  3 13:20 f1
-rw-r--r--  1 ghoti  wheel  0 Jan  3 13:20 f2
-rw-r--r--  1 ghoti  wheel  0 Jan  3 13:20 f3
-rw-r--r--  1 ghoti  wheel  0 Jan  3 13:20 f4

然后你在for循环的正确轨道上。但您可能希望将搜索范围缩小到仅对您重要的文件。

在bash中,您可以使用extglob来控制此类事情。例如:

#!/usr/bin/env bash

shopt -s extglob
for file in +([a-z])+([0-9]); do
  echo "Old: $file / New: file${file##[a-z]}"
done

这匹配任何名称由字母后跟数字组成的文件。

另一方面,如果你想让它变得可移植,那么它将在POSIX shell中工作(因为在你的问题中你已经指定了/bin/sh),你可能会将检测放入循环中本身:

#!/bin/sh

for file in *; do
  if ! expr "$file" : '[a-z][a-z]*[0-9][0-9]*$' >/dev/null; then
    continue
  fi
  echo "Old: $file / New: file${file##[a-z]}"
done

在这两个例子中,我们使用POSIX“参数扩展”去除文件名开头的字母。

答案 1 :(得分:0)

#!/bin/env bash

for FILE in *
do
    [[ "$FILE" =~ [0-9]+$ ]] && mv "$FILE" file${BASH_REMATCH[0]}
done

[[ ]]中的表达式是一个测试,它测试与正则表达式的匹配,该正则表达式查找以数字结尾的字符串。如果匹配成功,则可以在索引bash的{​​{1}}数组变量BASH_REMATCH中找到匹配的数字。如果测试成功,则执行0之后的部分,并将文件重命名为&&