2009-08-25 8 views
3

これは私が間違った質問をしている可能性があります。ツリー内のサブディレクトリへのシンボリックリンクを自動的に作成するBashスクリプト

私は特定の名前のサブディレクトリの下にあるすべてのサブディレクトリを見つけ、簡単なシェルスクリプトを作成しようとしている私は...そう、私は少しさびだ

を任意のシェルプログラミングをやったので、数年されていますそれらのディレクトリへのシンボリックリンクを作成します(それよりも混乱するような音がします)。私はWindows XPでcygwinを使用しています。私はそれをしたいよう

この発見/ grepコマンドは、ファイルシステム内のディレクトリを検索します。

難しい部分について今
find -mindepth 3 -maxdepth 3 -type d | grep "New Parts" 

...私はちょうど、そのリストを取り、LNへのパイプにして作成したいですいくつかのシンボリックリンク。ディレクトリのリストは、いくつかの空白を持っているので、私は少し物事をクリーンアップするxargsコマンドを使用しようとしていた。

find -mindepth 3 -maxdepth 3 -type d | grep "New Parts" | xargs -0 ln -s -t /cygdrive/c/Views 

残念ながら、LNは(\ nで区切って)一緒に連結するすべてのディレクトリの長いリストを吐くと、 「ファイル名が長すぎます」というエラーが出ます。

アイデア??

答えて

4

私はfindコマンド内でこれをすべて行うことができると思います。 OTTOMH:

find -mindepth 3 -maxdepth 3 -type d -name "*New Parts*" -exec ln -s -t /cygdrive/c/Views {} \; 

私は構文が正しいと思いました。

+1

-execフラグは+1です。人々はこれをたくさん忘れているようです。しかし、名前をスペースで囲んでいるので、{}を引用符で囲むこともできます。 –

1

あなたのコマンド

find -mindepth 3 -maxdepth 3 -type d | grep "New Parts" | xargs -0 ln -s -t /cygdrive/c/Views 

はxargsのに「-0」の引数を持っていますが、「-print0」(あなたがやった場合はgrepは中間にパイプで働くことができませんでした)を見つける教えてくれませんでした。

find -mindepth 3 -maxdepth 3 -type d | grep "New Parts" | tr '\012' '\000' | xargs -0 ln -s -t /cygdrive/c/Views 

trコマンドは、ASCII nullに改行を変換します:何が欲しいのは、次は私が推測です。

+1

NWCoderの答えのように 'grep'ではなく' -name'を使い、 '-print0'を使うことができます。 –

1

forループを使用します。

for name in $(find $from_dir -mindepth 3 -maxdepth 3 -type d); do 
    ln -s $name $to_dir 
done 

Xargsには、コマンドの最後にパイプからの入力が入る問題があります。 1つのコマンドだけではなく、複数のコマンドが必要です。

findコマンドの中で私が経験したことは、仕事が終わっても遅くなることがあります。

+0

見つかったディレクトリの1つにスペースが含まれていると、コマンドが失敗します。引用符、つまり<< ln -s "$ name" $ todir >>を追加する必要があります。これは、 "xargs -0"を使用することの大きな利点の1つです。 – hlovdal

+0

ああ、もちろん。厄介な小さなエスケープ問題。 – KFro

関連する問題