0

(Linux初心者はこちら)

マスターファイル「cs010101.SETUP」といくつかのサブディレクトリを含むディレクトリがあります。各サブディレクトリには、cs??????。dat3形式の一部を含む多数のファイルが含まれています。すべてのcs??????。dat3ファイルを検索し、それぞれについて、対応するディレクトリに、6桁の数字でマスターファイル(cs010101.SETUP)に戻るソフトリンクを作成する方法を探しています。それぞれのcs??????。dat3ファイルに一致するように変更されました。

たとえば、サブディレクトリにファイルcs219254.dat3が含まれている場合、次のコマンドを実行します

ln -s ../cs010101.SETUP cs219254.SETUP

これまでのところ、findコマンドまで持っています

find . -name "cs*dat3"

数を抽出するために切断する配管を調べました

find . -name "cs*dat3" | cut -c 13-18

(これは現在、サブディレクトリの命名規則が一貫しているため機能しますが、その事実に依存する必要がない場合は便利です)。

しかし今、私は困惑しています!

4

2 に答える 2

1

ちょっと考えてみてください...CSH(別名TCSH)は、変数にさまざまな「:」オプションを提供します-例:

% set a = ./b/bb/cs219255.dat3

% echo $a:h
./b/bb

% echo $a:t
cs219255.dat3

% echo $a:r
./b/bb/cs219255

% echo $a:e
dat3

絶対パスまたは相対パスが必要ですか?

foreach T ( `find . -name 'cs*dat3' -print` )
foreach? ln -s `pwd`/cs010101.SETUP  $T:r.SETUP-absolutepath
foreach? ln -s `echo $T:h | sed 's|/[^/]*|/..|g'`/cs010101.SETUP $T:r.SETUP-relativepath
foreach? end

警告:sed式では*の代わりに+を使用する必要があります(例:sed's | / [^ /] + | /..| g')。しかし、私はこれを非常に限られたシステムでテストしていて、sedのバージョンが壊れていました。 ため息

于 2012-09-30T14:51:17.783 に答える
0

sedを使用します。スクリプトは次のようになります。

for dname in `find . -maxdepth 1 -name "*" -type d`; do #list all subdirectories of this directory only
    for fnum in `find $dname -name "cs*.dat3" | sed 's/^.*cs\([0-9]*\)\.dat3$/\1/'`; do #extract numbers of needed files in subdir
        ln -s $PWD/cs010101.SETUP $dname/cs$fnum.SETUP #create link
    done
done
于 2012-09-30T12:31:18.240 に答える