我有一个充满一千多个文件的目录,并且名称有点长(并且在命名样式中找不到模式)。我想简化文件名。例如:
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
.....等等 !
任何人都可以为我提供一个脚本(awk
、sed
等)来读取源文件并相应地重命名文件吗?我可以在其他地方获得类似的脚本,但似乎没有什么对我有用。
答案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.pdb
为Bioimage_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