文件处理并使目录在bash中匹配

时间:2015-06-20 18:49:59

标签: bash shell sorting matching file-handling

我有以下文件:File_1.2.txtFile_1.5.txtFile_2.3.txtFile_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

因此,为文件使用的每个数字创建一个目录,并将包含目录匹配编号的所有文件分类到其中。

2 个答案:

答案 0 :(得分:2)

#!/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

答案 1 :(得分:1)

你至少应该亲自试过这个。仅仅复制其他人的代码并不是一种好的学习方式。

有几种方法可以做到这一点,这是我的,你的在哪里?

#!/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

其他人无疑会改善这一点。

编辑功能和序列。