0

(这里是 Linux 新手)

我有一个目录,其中包含一个主文件“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

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

但现在我难住了!

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 回答