2012-09-30 59 views
0

(Linux新手在這裏)我可以使用find命令在基於文件名的子目錄中創建鏈接嗎?

我有一個目錄包含一個主文件'cs010101.SETUP'和一些子目錄。每個子目錄包含大量的文件,其中包括一些格式cs ?????? dat3。我正在尋找一種方法來查找所有的cs ??????。dat3文件,然後爲其中的每個文件在其相應的目錄中創建一個軟鏈接回到主文件(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 

(這項工作目前作爲子目錄的命名約定是一致的,但如果不必依賴於這個事實將是很好的)。

但現在我很難過!

+1

你可以先通過'| |同時讀f;做basename $ f .dat3; done |',它將輸出名稱爲 – lanzz

回答

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 
+0

的'cs ######''部分謝謝。就是我以後的樣子。一個小問題是,它似乎也爲父目錄中的每個文件以及適當的子目錄創建一個鏈接。不是一個很大的問題,因爲它很容易處理不需要的鏈接'rm',但我只是不能看到你的腳本導致這個問題! –

+0

已經回答了我自己的問題。第一次通過循環查找父目錄和所有子目錄中的所有文件,並在父目錄中創建鏈接。然後它依次在每個子目錄上運行。包括一個-mindepth 1已經修復了這個問題,所以它只在子目錄中查看,這是我之後的行爲。再次感謝! –

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破損版本。 感嘆

+0

這應該是\ + - 看起來像是吃了我的反斜槓 – TooLazyToLogIn

相關問題