shell脚本将特定文件链接到一个级别

时间:2009-07-23 19:54:36

标签: macos unix shell sed ln

我有一个文件夹里面有很多文件夹,每个文件夹都包含一个电影文件。现在我希望能够一次看到所有这些电影(但我必须保留文件夹结构),所以我想将它们全部符号链接到顶级文件夹(目录Opus中的平面视图将在这里,但我我在Mac上。这是我的尝试

for file in */*/*.mov; 
do 
newname='echo $file | sed "s|[^/]*/[^/]*/||g"';
ln -s $file echo $newname;
done

所以我在第3行尝试做的是将路径foo / bar / spud.mov变成spud.mov,然后在第4行做ln -s foo / bar / spud.mov spud.mov

但它不起作用,我得到的只是

  

ln:“s | [^ /] / [^ /] / || g”:没有这样的文件或目录

我尝试了各种引号和转义组合,但没有运气。 sed表达式有效,但我显然已经用变量搞砸了。

由于

5 个答案:

答案 0 :(得分:2)

这将对所有文件夹级别执行相同的操作:


for i in `find . -name "*.mov"`
do
  file=`echo $i | /bin/awk -F'/' '{print $NF}'`
  /bin/ln -s $i $file
done

答案 1 :(得分:2)

所有echo $ file都有什么用sed或awk的东西,反正呢? basename是为此目的而制作的。

for file in */*/*.mov; do 
  newname=`basename $file1
  ln -s $file $newname;
done

但是,实际上,当给定目录时,ln会做同样的事情,所以:

for file in */*/*.mov; do
  ln -s "$file" .
done

或者是一个非常通用的版本,它足够智能,只需要根据需要多次调用ln:

find . -name \*.mov -depth +1 -print0 | xargs -0 -J % ln -s % .

也就是说,在本地目录中,查找名称以.mov结尾但不在当前目录中的所有内容(深度大于1),将输出与NULL分开,然后输入xargs,这样就寻找NULL - 分开输入,并将通过。作为ln的参数,它在stdin上读取的所有参数之后。

答案 2 :(得分:1)

Basename就是你想要的,你的解决方案的问题是引用不好:

bash-3.2$ echo $file
foo/bar/spud.mov
bash-3.2$ newname=$(echo $file | sed 's|[^/]*/[^/]*/||g'); echo $newname
spud.mov

答案 3 :(得分:0)

非常感谢大家。在这个问题上似乎是一些蠕虫。看来我正在做的事情虽然不是最好的方式,但如果我使用了正确的语法,那将会奏效。

但我已经了解了basename并提高了我对ln的知识,所以我很开心。

答案 4 :(得分:0)

我对如何使用find有了更多了解,所以现在我可以在一行中完成:

find . -name "*.mov" -exec ln -s {} \;

find命令中的 -exec 标志允许您在每次找到文件时运行另一个进程。如上所述放入一对花括号以将该文件作为参数提供给该进程。我花了一些时间来确定在转义分号之前需要有一个空格。