我有数百个以" .txt"为后缀的文件。 " txt"文件包含" id [0-9]"在带有分隔符","的列中来自其他专栏。我想要的是提取" id [0-9]"作为相应文件的文件名一个接一个,任何想法?
例如:ben.txt,cotains:
AA,BB,CC,id2233,KK
许多文件都是这样的。
然后如何使用shell或其他方法提取id2233以将ben.txt替换为id2233.txt?
感谢。
答案 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