如何根据父目录为子目录中的多个文件添加后缀?

How to add suffix to multiple files in subdirectories based on parent directory?

我有 100 多个目录如下:

bins_copy]$ ls

bin.1/  
bin.112/  
bin.126/  
bin.24/  
bin.38/  

等等等

这些目录中的每一个都包含两个文件名 genes.faagenes.gff,例如bin.1/genes.faa

我现在想根据父目录添加一个后缀,这样每个基因文件都有一个唯一的标识符,例如bin.1/bin1_genes.faabin1_genes.gff.

我整个上午都在探索 google 兔子洞,到目前为止没有任何效果。 我试过这样的事情:

for each in ./bin.*/genes.faa ; mv genes.faa ${bin%-*}_genes.faa $each ; done 

但是那个(以及它的几个版本)给我以下错误:

-bash: syntax error near unexpected token `mv'

由于这是一个非常通用的问题,我还没有弄清楚,非常感谢您的帮助。

干杯/

可能有更优雅的方法来执行此操作,但在与 bin 目录相同的目录中创建此脚本,chmod 700 和 运行。你可能想先用 tar 备份 (tar -cf bin.tar ./bin*)

#!/bin/bash
files="bin.*"
for f in $files; do
        mv ./${f}/genes.faa ./${f}/${f}_genes.faa
        mv ./${f}/genes.gff ./${f}/{$f}_genes.gff
done

试试这个 Shellcheck-干净的代码:

#! /bin/bash -p

for genespath in bin.*/genes.*; do
    dir=${genespath%/*}
    dirnum=${dir##*.}
    genesfile=${genespath##*/}
    new_genespath="$dir/bin${dirnum}_${genesfile}"
    echo mv -iv -- "$genespath" "$new_genespath"
done
  • 它目前只打印所需的 mv 命令。确认 echo 可以满足您的要求后,请将其删除。