从源文件读取后重命名一批文件

从源文件读取后重命名一批文件

我有一个充满一千多个文件的目录,并且名称有点长(并且在命名样式中找不到模式)。我想简化文件名。例如:

Bioimage_23335989_Data_22317866_22317867_20140723_1002.pdb
Bioimage_22335990_Data_22318490_22318491_20140723_1009.pdb
Bioimage_23835970_Data_22317866_22317867_20140723_1005.pdb

.....等等 !

我制作了一个简单的文本文件(filelist.txt),其内容如下:

1.pdb   Bioimage_23335989_Data_22317866_22317867_20140723_1002.pdb
2.pdb   Bioimage_22335990_Data_22318490_22318491_20140723_1009.pdb
3.pdb   Bioimage_23835970_Data_22317866_22317867_20140723_1005.pdb

.....等等 !

任何人都可以为我提供一个脚本(awksed等)来读取源文件并相应地重命名文件吗?我可以在其他地方获得类似的脚本,但似乎没有什么对我有用。

答案1

不需要 awk 或 sed,因为你的filelist.txt格式已经是完美的。

提前几件事......我假设文件名中没有空格,并且每行上的两个文件名之间用空格分隔。另外,我假设filelist.txt 终止在 EOF 之前有一个 EOL。

当然,在运行此命令之前先对目录进行备份。

#!/usr/bin/env bash
cd /path/to/pdb_files
while read -r line; do
  mv $line
done < /path/to/filelist.txt

解释

  • while read -r line; do:这会迭代文件的每一行,将每一行放入变量 中$line
  • mv $line:由于每行包含两个由空格分隔的文件名,因此我们可以将参数直接传递给mv.即它会立即将文件从第一个文件名移动到第二个文件名。

编辑

我刚刚重新阅读了你的问题。我将其解释为您想要将文件从(例如)重命名1.pdbBioimage_23335989_Data_22317866_22317867_20140723_1002.pdb.我不确定你是否想要相反的情况。如果是这样,那么下面的脚本将起作用。

#!/usr/bin/env bash
cd /path/to/pdb_files
while read -r line; do
  mv $(awk '{print $2, $1}' <<<$line)
done < /path/to/filelist.txt

解释

  • mv $(awk '{print $2, $1}' <<<$line):读取$line,并打印第二个字段,然后打印第一个字段。将这两个文件名作为参数传递给mv.

答案2

while read tname fname
do
  mv ${fname} ${tname}
done < filelist.txt

相关内容