【问题标题】:Creation of files with control of the names创建具有名称控制的文件
【发布时间】:2016-01-03 17:17:14
【问题描述】:

我有 n 个文件,分别命名为 f1f2、...、fn。对于这些文件中的每一个,我必须执行一个 sed 命令,并将新文件命名为 file1file2、...、filen .

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

这是我迄今为止尝试过的:

#!/bin/sh 

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

【问题讨论】:

  • 你能展示你到目前为止所尝试的吗? (代码)
  • 我正在开始计算:#!/bin/sh # Fichier "liste" for element in * do echo "$element" sed -n '/Col3/p' $element > Quest $元素完成它远非正确,但我有点挣扎
  • 这不是一个 bash 脚本。它使用/bin/sh 运行,因此即使是 bash,它也可以在 POSIX 兼容模式下运行。您是想以特定于 Bash 的方式执行此操作,还是像您的示例所暗示的那样,想要一个也可以在其他 shell 中运行的便携式解决方案?

标签: linux bash loops


【解决方案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 “参数扩展”来去除文件名开头的字母。

【讨论】:

    【解决方案2】:
    #!/bin/env bash
    
    for FILE in *
    do
        [[ "$FILE" =~ [0-9]+$ ]] && mv "$FILE" file${BASH_REMATCH[0]}
    done
    

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

    【讨论】:

    • 纯代码答案并不是非常有用。请考虑添加一些解释性文字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 2016-01-05
    • 2017-01-06
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多