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... $numberandnameBASHパラメータと置き換えを試してみましたが、正しく取得できません。

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)ここでは必要ありませんので、コマンドを削除しました。findstorage1
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"

関連情報