一部のディレクトリを移動して、そのディレクトリへのシンボリックリンクを作成する必要があります。
ディレクトリ構造は次のとおりです。
/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'
オプションを使用しました。 2)ここでは必要ありませんので、コマンドを削除しました。find
storage1
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"