1

ご検討いただきありがとうございます。

一度実行すると、通常は大文字形式のフォルダーのすべてのディレクトリを調べ、そのディレクトリへのシンボリックリンクを小文字形式で作成する単純なシェルスクリプトを作成しようとしています。次に、新しいフォルダーがディレクトリに追加され、新しいフォルダーへの追加のシンボリックリンクが作成されるときに、このスクリプトを定期的に実行します。スクリプトは、停止の問題やエラーを作成しないように、シンボリック リンクが既に作成されている他のフォルダーを認識している必要があります。以下は、私が達成しようとしていることの視覚化です。

drwxr-xr-x 2 root root 4096 Jun 18 03:52 Holmes
drwxr-xr-x 2 root root 4096 Jun 18 03:52 Kingship
-rwxrwxrwx 1 root root   85 Jun 18 04:39 link.sh
drwxr-xr-x 2 root root 4096 Jun 18 03:52 Lost
drwxr-xr-x 2 root root 4096 Jun 18 03:52 Monkey
drwxr-xr-x 2 root root 4096 Jun 18 03:52 Space Ship
drwxr-xr-x 2 root root 4096 Jun 18 03:52 Test

lrwxrwxrwx  1 root root    6 Jun 18 04:49 holmes -> Holmes
drwxr-xr-x  2 root root 4096 Jun 18 03:52 Holmes
lrwxrwxrwx  1 root root    8 Jun 18 04:49 kingship -> Kingship
drwxr-xr-x  2 root root 4096 Jun 18 03:52 Kingship
-rwxrwxrwx  1 root root   85 Jun 18 04:39 link.sh
lrwxrwxrwx  1 root root    4 Jun 18 04:49 lost -> Lost
drwxr-xr-x  2 root root 4096 Jun 18 03:52 Lost
lrwxrwxrwx  1 root root    6 Jun 18 04:49 monkey -> Monkey
drwxr-xr-x  2 root root 4096 Jun 18 03:52 Monkey
lrwxrwxrwx  1 root root   10 Jun 18 04:49 space ship -> Space Ship
drwxr-xr-x  2 root root 4096 Jun 18 03:52 Space Ship
lrwxrwxrwx  1 root root    4 Jun 18 04:49 test -> Test
drwxr-xr-x  2 root root 4096 Jun 18 03:52 Test

明らかに、スクリプトは、後で作成されるが、まだシンボリック リンクを持っていないフォルダーの新しいシンボリック リンクを作成できる必要があります。

私はこれらの他の2つの投稿/回答の構文をいじっていますが、個々の回答の結果を再作成する以外に実際には到達していません。投稿はこちらサブディレクトリで検索を使用してすべてのファイルへのシンボリックリンクを作成しBashスクリプトを使用してツリー内のサブディレクトリへのシンボリックリンクを自動的に作成します

おそらく、私は間違ったアプローチで解決策を考えています。私が実際に達成しようとしているのは、これがユーザー名に基づいて自動的に作成されたフォルダーを持つ NAS システムであるという事実です。その後、フォルダーは samba homes 共有を介して自動的に共有されます。ただし、フォルダーは最初にスペースを使用して作成され、ユーザー名の大文字と小文字の構造も使用されるため、小文字のフォルダーを作成しない限り、共有にアクセスすることはできません。UNIX システムでのテストとテストは 2 つの異なるものであるため、ユーザー名の構造は UNIX システムと完全に互換性があるわけではありません。大文字を使用してユーザー名を作成できるようにする方法を調査しましたが、これらの変更を行っても、samba 共有がフォルダーを認識する方法には影響しません。

4

1 に答える 1

2

段階的な方法:

まず、スクラッチ ディレクトリに、あなたのようなディレクトリのサンプルを作成しています。

$ mkdir Holmes Kingship Lost Monkey 'Space Ship' Test a_lower_case_one
$ touch just_a_file One_with_UpperCase
$ ln -s Holmes holmes
$ ls -og
total 28
drwxr-xr-x 2 4096 Jun 18 11:54 a_lower_case_one
lrwxrwxrwx 1    6 Jun 18 11:54 holmes -> Holmes
drwxr-xr-x 2 4096 Jun 18 11:54 Holmes
-rw-r--r-- 1    0 Jun 18 11:54 just_a_file
drwxr-xr-x 2 4096 Jun 18 11:54 Kingship
drwxr-xr-x 2 4096 Jun 18 11:54 Lost
drwxr-xr-x 2 4096 Jun 18 11:54 Monkey
-rw-r--r-- 1    0 Jun 18 11:54 One_with_UpperCase
drwxr-xr-x 2 4096 Jun 18 11:54 Space Ship
drwxr-xr-x 2 4096 Jun 18 11:54 Test

では、どのようにディレクトリをループするのでしょうか? そのようです:

$ for i in */; do echo "$i"; done
a_lower_case_one/
holmes/
Holmes/
Kingship/
Lost/
Monkey/
Space Ship/
Test/

bashで変数を小文字に変換するにはどうすればよいですか? bash リファレンス マニュアルのこのセクションによると、 の展開は小文字の展開に${i,,}なります。$i

$ for i in */; do echo "$i -> ${i,,}"; done
a_lower_case_one/ -> a_lower_case_one/
holmes/ -> holmes/
Holmes/ -> holmes/
Kingship/ -> kingship/
Lost/ -> lost/
Monkey/ -> monkey/
Space Ship/ -> space ship/
Test/ -> test/

これで、小文字の展開とは異なるディレクトリ名のみを考慮することができます。

$ for i in */; do [[ $i = ${i,,} ]] && continue; echo "$i -> ${i,,}"; done
Holmes/ -> holmes/
Kingship/ -> kingship/
Lost/ -> lost/
Monkey/ -> monkey/
Space Ship/ -> space ship/
Test/ -> test/

これらのそれぞれについて、小文字のものが既に存在するかどうかをテストします。

$ for i in */; do [[ $i = ${i,,} ]] && continue; echo "$i -> ${i,,}"; if [[ -e ${i,,} ]]; then echo "    ${i,,} exists"; fi; done
Holmes/ -> holmes/
    holmes/ exists
Kingship/ -> kingship/
Lost/ -> lost/
Monkey/ -> monkey/
Space Ship/ -> space ship/
Test/ -> test/

小文字が既に存在する場合は、大文字へのリンクかどうかを確認します。はいの場合、すべて問題ありません。そうでない場合は、警告を出力します。少し大きくなったので、bashスクリプトとして記述します。

#!/bin/bash

for i in */; do
    d=${i%/}
    dl=${d,,}
    [[ $d = $dl ]] && continue
    if [[ -e $dl ]]; then
        if [[ ! -L $dl ]]; then
            echo "    ERROR: $dl is not a link"
        elif [[ $(readlink -- "$dl") != $d ]]; then
            echo "    ERROR $dl exists and doesn't point to $d"
        fi
    else
        ln -sv -- "$d" "$dl"
    fi
done

ファイル名の変な記号 (スペース、ハイフンなど) に関して安全な堅牢なスクリプトを作成するために、私が知っているすべてのベスト プラクティスを使用しました。

ノート。処理するディレクトリ内から呼び出す必要があります。cd必要に応じて、このスクリプトの先頭で使用します。

お役に立てれば!

于 2013-06-18T10:22:01.390 に答える