我可以使用find命令根据文件名在子目录中创建链接吗?

时间:2012-09-30 11:49:23

标签: linux

(Linux新手在这里)

我有一个包含主文件'cs010101.SETUP'和许多子目录的目录。每个子目录包含大量文件,包括一些格式cs ??????。dat3。我正在寻找一种方法来查找所有cs ??????。dat3文件,然后为每个文件在相应的目录中创建一个软链接,返回主文件(cs010101.SETUP),其中包含六位数字更改为匹配相应的cs ??????。dat3文件。

例如如果子目录包含文件cs219254.dat3,我想执行命令

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

到目前为止,我已经找到了命令

find . -name "cs*dat3"

并查看要切割的管道以提取数字

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

(这当前作为子目录的命名约定是一致的,但如果不必依赖于这个事实会很好。)

但现在我很难过!

2 个答案:

答案 0 :(得分: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版本。 叹息

答案 1 :(得分: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