需要将具有名称的文件移动到具有相应名称的目录中

需要将具有名称的文件移动到具有相应名称的目录中

我有名为

患者样本_L001_R1_001、患者样本_L002_R1_001、患者样本_L003_R1_001、患者样本_L004_R1_001

另一组名为

病人样本_L001_R1_002、病人样本_L002_R1_002、病人样本_L003_R1_002、病人样本_L004_R1_002、

等等等等。对于每组 4 个文件(具有不同的结束编号 001,002,003),我需要将其移动到标记为 Patient0001 或 Patient 0002 的适当目录中,依此类推。我有大约 200 套这样的套装。是否有一个命令可以扫描具有不同结束编号的文件并将其放入适当的患者文件夹中?

即患者_样本_L001_R1_001,患者_样本_L002_R1_001,患者_样本_L003_R1_001,患者_样本_L004_R1_001,进入“患者0001文件夹等。

每个文件都位于不同的目录中。例如,主目录有一个名为 run40 的目录,其中包含病人 1 的数据。然后在 run41 中,有患者 2 数据等。回到主目录中,还有另一个名为“total_patent_samples”的目录,您可以在其中找到我想要从“run40、run41”目录移动文件的所有目录进入。在该文件中有病人0001、病人0002、病人0003。我希望将上述数据文件放入其中。

答案1

怎么样

for i in `seq -f '%03g' 1 200`; do
    FOLDER=patient0$i
    mkdir -p total_patient_samples/$FOLDER    # creates folder if missing
    find . -regex ".*patient_sample_L00._R._${i}$" -type f -exec mv -i {} total_patient_samples/$FOLDER/ \; # moves patient data if not already there, else prompts
done

此操作i从 001 循环到 200(如有必要,更改 200),创建患者文件夹(mkdir ...如果不需要,则删除该行),查找您指定的结构的所有患者,并将它们移动到文件夹中。

答案2

你可以这样做:

cd total_patient_samples
find ../ -name patient_sample_\* | while read -r i; do
    pnum="${i##*_}"
    mkdir -p "patient$pnum"
    mv -v "$i" "patient$pnum"
done

这很大程度上取决于文件的确切名称,因此最好小心。

编辑:根据下面的评论更新了代码。这将抓取主目录下匹配的任何文件patient_sample_*,因此请确保没有任何您不想移动的文件。

答案3

你可以这样做:

for file in patient*; do
 PATIENT_NO=$(echo $file | sed 's/patient_sample_.*R1_\(.*\)/\1/')
 PATIENT_DIR=patient$PATIENT_NO
 mkdir -p $PATIENT_DIR
 mv $file $PATIENT_DIR
done

首先,我们剪切sed患者编号,然后构建目录名称并将文件移入其中。

相关内容