(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
(这当前作为子目录的命名约定是一致的,但如果不必依赖于这个事实会很好。)
但现在我很难过!
答案 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