我需要移动一些目录并创建回它们的符号链接。
目录结构如下:
/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"