8

我有很多文件

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

我想根据文件名的第一部分创建一系列目录,直到第一个“。”

BR0200
BR210
W0210

然后将相关文件移动到正确的目录(即所有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

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

4

2 回答 2

7

作业中不允许有空格=

dir="${file%%.*}"

相反,测试中需要空格。

if [ -e $dir ]; then
    ^       ^

就风格改进而言,做一个不必要的 没有什么坏处mkdir -p,所以你可以摆脱这种if说法。

作业中不需要引号,因此您可以将它们从dir=行中删除。不过,在其他地方引用是个好主意,所以不要删除其他引用。

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

for file in {BR,W0}*.*; do
    dir=${file%%.*}
    mkdir -p "$dir"
    mv "$file" "$dir"
done
于 2012-10-22T22:18:28.227 回答
0

你可以尝试这样的事情:

for file in BR* WO*
do
dir=$(echo ${file} | awk -F. '{print $1}' OFS=.)
mkdir $dir
mv $file $dir
done

我有类似的情况,这对我有用。

于 2016-10-21T12:59:32.683 回答