![Shell 脚本创建带有文件名的文件夹并将文件复制到其中](https://linux22.com/image/1172799/Shell%20%E8%84%9A%E6%9C%AC%E5%88%9B%E5%BB%BA%E5%B8%A6%E6%9C%89%E6%96%87%E4%BB%B6%E5%90%8D%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B9%E5%B9%B6%E5%B0%86%E6%96%87%E4%BB%B6%E5%A4%8D%E5%88%B6%E5%88%B0%E5%85%B6%E4%B8%AD.png)
我有一份如下列表
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