2012-10-22 62 views
6

我有文件创建从文件名的目录和移动庆典

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 

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

+0

@owlstead你是什么意思? –

+0

@owlstead globbing是shell必须提供的最有用的功能之一。 – jordanm

+0

@jordanm你是对的,当然,删除评论。 –

回答

6

作业中=周围不允许有空格。

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 
0

你可以尝试这样的事情:

在BR *文件WO *;不要 DIR = $(回声$ {文件} |。awk的-F '{打印$ 1}' OFS =) 的mkdir $ DIR MV $文件$目录 做

我也有类似的情况,这工作为了我。

相关问题