从文件名中提取唯一ID

时间:2014-10-24 23:07:46

标签: linux bash shell unix

我通过将文件放在子目录中来组织目录中的文本文件。子目录名称源自原始文件名。通过这种方式,可以很容易地判断哪个文件属于其各自的文件夹。 bash for loop遍历所有txt文件并相应地创建文件夹。文本文件具有以下示例格式:xxxx-test_file1-aa1-a2.txtxxxx-test_file1-aa1--2.txt。根据第一个示例,对于即将创建的文件夹的名称,仅有两个重要的事项是xxxx-aa1-a2(最后总是有6个字符的唯一ID)。因此,新文件夹将命名为xxxx-aa1-a2。以下内容仅适用于提取某些文件的正确名称,并与其他文件分隔。

FILE_PATH="/my_files/"
for file in "$FILE_PATH"/*.txt; do
    tmp=${file#*-}; head=${file%-"$tmp"}
    mid=${tmp%-*}; tail=${tmp#"$mid"-}
    base="${head,,}-${tail,,}"
    dir=${base%.txt}
    mkdir -p "$dir"
    mv "$file" "$dir/$base"
done

${var#prefix}扩展为var的值,前缀已删除,${var%suffix}相应地使用后缀执行相同的替换。最后,${var,,}生成值的小写版本。然后我们简单地从这些部分组装您想要的文件名结构。

如果文件只有两个-xxxx-test_file-aaasw1xxxx-test_file-bswb2u

,则上述情况有效
|-- ./
|   |-- xxxx-aaasw1
|       |--xxxx-test_file-aaasw1.txt
|   |-- xxxx-bswb2u
        |--xxxx-test_file-bswb2u.txt.

但如果文件有两个以上-xxxx-test_file-caa-v3uxxxx-test_file-caa-v3-

,则会中断
|-- ./
|   |-- xxxx-v3u
|       |-- xxxx-test_file-caa-v3u.txt
|   |-- xxxx-
        |-- xxxx-test_file-caa-v3-.txt.

2 个答案:

答案 0 :(得分:2)

所以,你想要将目录命名为“a-b”,其中a是第一个破折号的所有内容,b是最后一个破折号和第一个点之间的所有内容吗?

touch xxxx-test_file-aaasw1
touch xxxx-test_file-bswb2u
touch xxxx-test_file-caa-v3u.txt
touch xxxx-test_file-caa-v3-.txt

for f in *
do
    head=$(cut -f1  -d'-' <<< "$f")
     mid=$(cut -f2  -d'-' <<< "$f")
    tail=$(cut -f3- -d'-' <<< "$f" | cut -f 1 -d .)
     ext=$(cut -f3- -d'-' <<< "$f" | cut -f 2- -d .)
    echo "[$head][$mid][$tail][$ext]"
    mkdir "${head}-${tail}"
    mv "${f}" "${head}-${tail}/${head}-${tail}.${ext}"
    echo "${mid}" > "${head}-${tail}"/title_info.txt
done

tree

输出:

|-- xxxx-aaasw1
|   `-- xxxx-test_file-aaasw1
|-- xxxx-bswb2u
|   `-- xxxx-test_file-bswb2u
|-- xxxx-caa-v3-
|   `-- xxxx-test_file-caa-v3-.txt
`-- xxxx-caa-v3u
    `-- xxxx-test_file-caa-v3u.txt

还有其他几种方法可以解决这个问题,但我能想到的方法比这种直截了当但不是非常有效的方法更加神秘。

答案 1 :(得分:1)

只需更改mid作业,使其在短划线后总是修剪六个字符,然后是点和扩展名。

mid=${tmp%-??????.*};