使用 find 来定位、移动和符号链接匹配 [0-9]{1,10}/* 的目录树

使用 find 来定位、移动和符号链接匹配 [0-9]{1,10}/* 的目录树

我需要移动一些目录并创建回它们的符号链接。

目录结构如下:

/storage1
/storage1/123/named_directory_1
/storage1/123456/named_directory_2
/storage1/123456789/named_directory_3

我想移动命名的目录,以匹配其他地方的编号目录,如下所示:

/storage2
/storage2/123/named_directory_1
/storage2/123456/named_directory_2
/storage2/123456789/named_directory_3

然后将这些命名目录符号链接回来。编号目录在每个存储上保留为独立目录,但命名目录应从 storage1 上各自的编号目录符号链接到 storage2 上匹配的编号目录。

我制定了一个与我想要的相匹配的 find 命令:find . -type d -mindepth 2 -maxdepth 2 -regextype grep -regex ".*/[0-9]\{1,10\}/.*"它与所有这些相匹配:

/storage2/123/named_directory_1
/storage2/123456/named_directory_2
/storage2/123456789/named_directory_3

但我不知道如何进行所有操作。像这样的东西,但你可以看到我不知道如何得到$number$numberandname但我一直在尝试 BASH 参数和替换,但我不能完全正确。

echo "${named#*/}"
named_directory_1

和这个:

echo "${named%/*}"
/storage/123

这是我最好的脚本大纲:

while read -r named; do
export numberandname="${named#/*/*/*/}"
export number="${numberandname%/*}"
    mv -- "$named" "/storage2/$number/"
    ln -s -- "/storage2/$numberandname "$named"
done < <(find /storage1/ -type d -mindepth 2 -maxdepth 2 -regextype grep -regex ".*/[0-9]\{1,10\}/.*")

答案1

我为您的代码添加了一些改进(在我看来)。

1)我使用了命令-printf '%P\n'选项find,这给出了没有storage1部分的路径。
2)删除了export命令,因为这里不需要它。

#!/bin/bash

src_dir="storage1"
dest_dir="storage2"    

nums_and_names=$(find "$src_dir" -type d -mindepth 2 -maxdepth 2 -regextype grep -regex ".*/[0-9]\{1,10\}/.*" -printf '%P\n')

while read -r named; do
    echo mv -- "${src_dir}/$named" "${dest_dir}/${named%/*}"
    echo ln -s -- "${dest_dir}/$named" "${src_dir}/$named" 
done <<< "$nums_and_names"

相关内容