bash中的文件处理和目录匹配

bash中的文件处理和目录匹配,bash,shell,sorting,matching,file-handling,Bash,Shell,Sorting,Matching,File Handling,我有这些文件:文件1.2.txt、文件1.5.txt、文件2.3.txt和文件4.7.txt 我想为它们创建目录,并将它们排序到目录中,如下所示 Dir_001 -> File_1.2.txt File_1.5.txt Dir_002 -> File_1.2.txt File_2.3.txt Dir_003 -> File_2.3.txt Dir_004 -> File_4.7.txt Dir_005 -> File_1.5.txt Dir_007

我有这些文件:文件1.2.txt、文件1.5.txt、文件2.3.txt和文件4.7.txt

我想为它们创建目录,并将它们排序到目录中,如下所示

Dir_001 -> File_1.2.txt File_1.5.txt 

Dir_002 -> File_1.2.txt File_2.3.txt

Dir_003 -> File_2.3.txt 

Dir_004 -> File_4.7.txt 

Dir_005 -> File_1.5.txt 

Dir_007 -> File_4.7.txt

因此,将为文件使用的每个编号创建一个目录,并将包含该目录匹配编号的所有文件排序到该目录中

你至少应该自己尝试一下。仅仅复制别人的代码并不是一种好的学习方式

有几种方法,这是我的,你的呢

#!/bin/bash

function make_dir
{
    #name="Dir00$1"
    # Cribbed from the answer given by @Cyrus
    printf -v name "Dir_%03d" "$1"

    echo "$name"
    if [[ ! -d $name ]]
    then
        mkdir "$name"
    fi
}

# I don't need an array here, but I have no idea where these filenames come from
filenames=(File_1.2.txt File_1.5.txt File_2.3.txt File_4.7.txt)

for fname in ${filenames[@]}
do
    for seq in {1..999}      # No idea what the upper limit should be
    do
        #if [[ $fname == *$seq* ]]
        # Edit: to handle multi-character sequences
        if [[ $fname == *[_.]$seq.* ]] 
        then
            dir=$(make_dir $seq)
            cp "$fname" "$dir"
        fi
    done
done
其他人无疑会在这方面有所改进


编辑函数和序列。

这太棒了!我不知道从哪里开始,在过去的几个小时里我一直在尝试一些东西,但是没有成功。我唯一的问题是,如何在name=Dir00$1处使用printf或sprintf这样的东西,所以当我有10个或更多目录时,它是Dir010而不是Dir0010。@ChemistnotaProgrammer:看看Cyrus给出的答案,这应该会给你一个线索。我对使用他的方法犹豫不决,因为那是剽窃。您应该增加{1..7}中的顺序-您的问题中没有提到大于7的数字,@ChemistnotaProgrammer:将name=Dir00$1替换为printf-v name Dir_%0.3d$1。@cdarke:这是一个错误。这个圆点没用。“谢谢你!”程序员:你猜怎么着?现在你是一名程序员。来吧,加入我们,不要害怕,成为我们中的一员我们中的一员,我们中的一员,我们中的一员……你能给我简单描述一下IFS=\ux这一行吗。读foo num1 num2 foo这行使用uu和。作为字段分隔符并将字符串(例如文件_1.2.txt)从$i拆分为四部分。无用文件到$foo、1到$num1、2到$num2和无用的txt将再次覆盖$foo以避免出现新变量。
#!/bin/bash

# If there are no files match File_*.*.txt
# replace File_*.*.txt by empty string
shopt -s nullglob 

for i in File_*.*.txt; do
  echo "processing file $i"
  IFS="_." read foo num1 num2 foo <<< "$i"
  printf -v dir1 "Dir_%03d" "$num1"
  printf -v dir2 "Dir_%03d" "$num2"
  mkdir -pv "$dir1" "$dir2"
  cp -v "$i" "$dir1"
  cp -v "$i" "$dir2"
done