3

わかりました、これはこれを投稿する 3 回目の試みです。おそらく、間違った質問をしている可能性があります!!

シェルプログラミングをしてから数年が経ちましたので、少し錆びています...

ツリー内の特定の名前付きサブディレクトリの下にあるすべてのサブディレクトリを検索し、それらのディレクトリへのシンボリック リンクを作成する単純なシェル スクリプトを作成しようとしています (実際よりもややこしく聞こえます)。Windows XP で cygwin を使用しています。

この find/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

3 に答える 3

4

これはすべて find コマンド内で実行できると思います。オットー:

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

その構文を正しく覚えていることを願っています。

于 2009-08-25T21:39:53.613 に答える
1

forループを使用します。

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

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

findコマンド内で物事を行う私の経験は、仕事を成し遂げることはできますが、遅くなることがあります。

于 2009-08-25T21:46:46.377 に答える
1

あなたの命令

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

xargs に引数 "-0" がありますが、find を "-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 に変換します。

于 2009-08-25T21:40:46.873 に答える