如何根据shell中逗号分隔的内容批量重命名文件?

时间:2017-04-01 02:28:41

标签: shell

我有数百个以" .txt"为后缀的文件。 " txt"文件包含" id [0-9]"在带有分隔符","的列中来自其他专栏。我想要的是提取" id [0-9]"作为相应文件的文件名一个接一个,任何想法?

例如:ben.txt,cotains:

AA,BB,CC,id2233,KK

许多文件都是这样的。

然后如何使用shell或其他方法提取id2233以将ben.txt替换为id2233.txt?

感谢。

3 个答案:

答案 0 :(得分:0)

生成重命名文件的脚本。

# old.names: generate files with old and new names
# new.names: 
# rename.sh: file with commands to rename

paste old.names new.names | awk '{o = $1; n = $2; print "mv", o, n}' > rename.sh

# if you like how rename.sh looks
sh rename.sh

一个可以容忍文件名中空格的发烧友版本

paste old.names new.names | \
    awk -v FS='\t' \
    '{ o = $1
       n = $2
       print "mv --", w(o), w(n)          
     }
     function w(s) { return "'" s "'"} # wrap
    '

答案 1 :(得分:0)

如果这是执行此操作的最佳方式,我不知道,但您可以遍历目录中的所有文件,选择“id”字段,然后发出重命名语句。这是一种方式:

#include <conio.h>
#include <stdio.h>

int main()
{
  int data[5], i, steps, temp, j, k;
  int n = 5;

  for (i = 0; i < n; ++i) {
    printf("%d. Enter element: ", i + 1);
    scanf("%d", &data[i]);
  }

  for (k = 0; k < n; k++) {
    for (j = 0; j < n; j++) {
      for (steps = 0 + j; steps <= j; steps++) {
        printf("%d\n\n", steps);

        if (data[steps] > data[steps + 1]) {
          temp = data[steps];
          data[steps] = data[steps + 1];
          data[steps + 1] = temp;
        }
      }
    }
  }

  printf("In ascending order: ");
  for (i = 0; i < n; ++i) printf("%d  ", data[i]);
  getch();
}

注意:这会将第一条记录带有“id”字段并使用该字段。

这不假设“id”字段的任何特定位置,它将使用任何长度编号。但是,它确实假设“,id”在id号之前。

哦,在这个例子中,重命名命令正在回显给终端,所以除了告诉你它会做什么外,它实际上不会做任何事情。您需要删除回声以使其实际执行您想要的操作。

希望这有帮助!

答案 2 :(得分:0)

以下是谨慎的实现(不会覆盖现有文件;不会移动当前目录之外的文件;不容易shell injection attacks;仅使用内置函数,而不是mv命令本身)。

#!/bin/bash
for f in *.txt; do
  IFS=, read -r _ _ _ id _ <"$f" || continue
  [[ $id = */* ]] && continue ## refuse to move files outside this directory
  [[ $id = .* ]] && continue ## refuse to give files hidden names
  [[ -e $id.txt ]] && continue ## refuse to overwrite files that already exist
  [[ $f = "$id.txt" ]] && continue ## skip if name already matches destination
  mv -- "$f" "$id.txt"
done