Shell 脚本创建带有文件名的文件夹并将文件复制到其中

Shell 脚本创建带有文件名的文件夹并将文件复制到其中

我有一份如下列表

ABC_100.0_k_1x1x1.xyz
ABC_100.0_k_1x1x1.txt
ABC_100.0_k_2x2x2.xyz
ABC_100.0_k_2x2x2.txt
ABC_100.0_k_10x10x10.xyz
ABC_100.0_k_10x10x10.txt
ABC_600.0_k_1x1x1.xyz
ABC_600.0_k_1x1x1.txt
ABC_1000.0_k_1x1x1.xyz
ABC_1000.0_k_1x1x1.txt

我想编写一个脚本来创建以下文件夹

ABC_100.0_k_1x1x1
ABC_100.0_k_2x2x2
ABC_100.0_k_10x10x10
ABC_600.0_k_1x1x1
ABC_1000.0_k_1x1x1

我尝试过以下方法

#!/bin/bash

for file in *_???.*_?x?x?.*
    do
        dir=${file%}
        dir=${dir%.*}
        mkdir -p "./$dir" &&
        scp -r "$file" "./$dir"
done

但我只得到了文件夹

ABC_100.0_k_1x1x1
ABC_600.0_k_1x1x1

我做错了什么?也许这很愚蠢,但这是我第一次尝试编写 shell 脚本

答案1

另一个脚本是:

#!/bin/bash

for file in *_*.*_*x*x*.*
    do
        dir=${file%}
        dir=${dir%.*}
        #if [ ! -d "$dir" ];
        #then
                mkdir -p "./$dir"

        #fi
        scp -r "$file" "./$dir"
done

符号 ? 替换单个字符,因此它只适合序列 1x1x1 或 2x2x2,而不是 10x10x10(10 由两个字符组成)。我添加了一个 if 语句,只是为了避免重新创建相同的文件夹。

答案2

这是一个可以运行的快速而粗糙的脚本:

#!/bin/bash

for file in *.???
    do
        dir=${file%.*}  # cuts off the suffix
    mkdir -p $dir
    scp "$file" "$dir"
    done

您的某些文件与模式不匹配_???。_?x?x?.*

答案3

如果所有文件都是成对的,并且带有.txt.xyz扩展名,那么一个简单的解决方案就是

for file in ABC*.txt
do
   mkdir `basename $file .txt`
done

相关内容