从文件名创建目录并移动bash

ale*_*106 6 linux bash

我有一大堆文件

BR0200.aaa.tsv
BR0200.bbb.tsv
BR0200.ccc.tsv
BR0210.aaa.tsv
BR0210.bbb.tsv
BR0210.ccc.tsv
W0210.aaa.tsv
W0210.aaa.tsv
W0210.aaa.tsv
Run Code Online (Sandbox Code Playgroud)

我想基于文件名的第一部分创建一系列目录,直到第一个'.'

BR0200
BR210
W0210
Run Code Online (Sandbox Code Playgroud)

然后将关联的文件移动到正确的目录(即所有BR0200.*文件到BR0200目录).

我有一个bash脚本,但我一直在收到错误.我们将非常感激地收到任何建议.

#!/bin/bash

for file in BR* W0*; do
dir = "${file%%.*}"
if [-e $dir];then
mv "$file" "$dir"
else
mkdir -p "$dir"
mv "$file" "$dir"
fi
done
Run Code Online (Sandbox Code Playgroud)

对不起,如果这是一个基本问题.我试过在网上搜索,但没有结果.

Joh*_*ica 6

=在作业中不允许有空格.

dir="${file%%.*}"
Run Code Online (Sandbox Code Playgroud)

相反,测试中需要空格.

if [ -e $dir ]; then
    ^       ^
Run Code Online (Sandbox Code Playgroud)

至于风格的改进,做一个不必要的事情并没有伤害mkdir -p,所以你可以摆脱这种if说法.

作业中不需要引号,因此您可以从dir=行中删除它们.尽管如此,引用在其他地方都是一个好主意,所以不要删除其他引号.

.*向for循环添加额外内容可能会很好.这样,如果您不止一次运行脚本,它将不会尝试移动这些新创建的子目录.一个巧妙的技巧(虽然不一定是一个改进)是缩短BR*.* W0*.*{BR,W0}*.*.

for file in {BR,W0}*.*; do
    dir=${file%%.*}
    mkdir -p "$dir"
    mv "$file" "$dir"
done
Run Code Online (Sandbox Code Playgroud)