У меня есть список, который выглядит следующим образом
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
Что я делаю не так? Возможно, это глупо, но это была моя первая попытка сценариев оболочки
Альтернативный сценарий:
#!/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, чтобы не создавать заново ту же папку.
Если все файлы сопряжены, либо с .txt
, либо с .xyz
, тогда простым решением будет
for file in ABC*.txt
do
mkdir `basename $file .txt`
done
Вот быстрый и грязный скрипт, который работает:
#!/bin/bash
for file in *.???
do
dir=${file%.*} # cuts off the suffix
mkdir -p $dir
scp "$file" "$dir"
done
Некоторые из ваших файлов не соответствуют шаблону _ ???. _? х? х?. *