【问题标题】:creating directory from filename and move bash从文件名创建目录并移动 bash
【发布时间】:2019-06-12 23:40:17
【问题描述】:

我有很多文件

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

抱歉,这是一个基本问题。我试过在网上搜索,但没有结果。

【问题讨论】:

  • @owlstead globbing 是 shell 必须提供的最有用的功能之一。
  • @jordanm 你当然是对的,删除评论。

标签: linux bash


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你可以试试这样的:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 2022-05-31
      • 2017-03-09
      • 2019-12-20
      相关资源
      最近更新 更多