我有大量文件
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 :(得分: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
答案 1 :(得分:0)
您可以尝试这样的事情:
用于BR * WO *中的文件;做 dir = $(echo $ {file} | awk -F。'{print $ 1}'OFS =。) mkdir $ dir mv $ file $ dir 完成
我有类似的情况,这对我有用。