如何在Unix中将文件移动到名称相似的文件夹中?

时间:2019-01-21 16:51:57

标签: bash unix filenames mv

很抱歉,如果您之前曾问过这个问题,我只是不知道如何将其写成搜索查询。

我有一组看起来像这样的文件夹:

Brain - Amygdala/                 Brain - Spinal cord (cervical c-1)/  Skin - Sun Exposed (Lower leg)/
Brain - Caudate (basal ganglia)/  Lung/                                Whole Blood/

我还有一组看起来像这样的文件:

Brain_Amygdala.v7.covariates_output.txt                  Skin_Not_Sun_Exposed_Suprapubic.v7.covariates_output.txt
Brain_Caudate_basal_ganglia.v7.covariates_output.txt     Skin_Sun_Exposed_Lower_leg.v7.covariates_output.txt
Brain_Spinal_cord_cervical_c-1.v7.covariates_output.txt  Whole_Blood.v7.covariates_output.txt

如您所见,文件名称与目录不完全匹配。例如,Brain_Amygdala.v7.covariates_output.txtBrain - Amygdala/并不完全相同。即使我们要从协变量文件中删除组织名称,Brain_Amygdala的格式也不同于其对应的文件夹。

Whole Blood/相同。即使您要从协变量文件Whole_Blood.v7.covariates_output.txt中分离组织名称,它也与Whole_Blood不同。

但是,我要做的是将这些组织文件中的每个移动到其相应的文件夹中。如果您注意到,协变量文件将以组织的名称命名,该组织一直指向文件名中的第一个点.。它们之间用下划线_隔开。 我想如何解决这个问题是为了分解文件名前.前的前几个单词,以便我可以轻松地将其移至相应的文件中。 >

例如

Brain_Amygdala.v7.covariates_output.txt-> Brain*Amygdala [mv]-> Brain*Amygdala/

a)我不确定如何隔离文件名中的第一个单词,直到文件名中的第一个.

b)如果要这样做,我不知道如何在每个单词之间插入通配符并将其匹配到相应的文件夹。

但是, 我完全愿意接受其他类似方法。

1 个答案:

答案 0 :(得分:2)

不是一个完整的答案,但它可以解决您的一些问题:

a)隔离字符串的第一个单词,直到第一个.:使用Parameter Expansions

string=Brain_Amygdala.v7.covariates_output.txt
until_dot=${string%%.*}
echo "$until_dot"

将输出Brain_Amygdala(我们保存在变量until_dot中)。

b)您可能想使用${parameter/pattern/string}参数扩展名:

# Replace all non-alphabetic characters by the glob *
glob_pattern=${until_dot//[^[:alpha:]]/*}
echo "$glob_pattern"

将输出(与上面的变量相同)Brain*Amygdala

c)要使用所有这些方法:首先确定可能的目标并进行一些基本检查可能是个好主意:

# Use nullglob to have non matching glob expand to nothing
shopt -s nullglob
# DO NOT USE QUOTES IN THE FOLLOWING EXPANSION:
# the variable is actually a glob!
# Could also do dirs=( $glob_pattern*/ ) to check if directory
dirs=( $glob_pattern/ )

# Now check how many matches there are:
if ((${#dirs[@]} == 0)); then
    echo >&2 "No matches for $glob_pattern"
elif ((${#dirs[@]} > 1)); then
    echo >&2 "More than one matches for $glob_pattern: ${dirs[@]}"
else
    echo "All good!"
    # Remove the echo to actually perform the move
    echo mv "$string" "${dirs[0]}"
fi

我不知道您的数据将如何有效地符合这些要求,但是我希望这个答案实际上能回答您的一些问题! (要了解有关参数扩展的更多信息,请阅读并尝试使用指向我给您的引用的链接)。