0

我有一个文件夹,里面有很多文件夹,每个文件夹都包含一个电影文件。现在我希望能够一次看到所有这些电影(但我必须保留文件夹结构)所以我想将它们全部符号链接到顶级文件夹(目录 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 表达式有效,但我显然用我的变量搞砸了一些东西。

谢谢

4

5 回答 5

2

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


for i in `find . -name "*.mov"`
do
  file=`echo $i | /bin/awk -F'/' '{print $NF}'`
  /bin/ln -s $i $file
done
于 2009-07-23T20:42:06.497 回答
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 在标准输入上读取的所有参数之后的参数。

于 2009-07-24T04:01:45.740 回答
1

Basename 是您想要的,而您的解决方案的问题是引用不佳:

bash-3.2$ 回显 $file
foo/bar/spud.mov
bash-3.2$ newname=$(echo $file | sed 's|[^/]*/[^/]*/||g'); 回声$新名称
spud.mov
于 2009-07-23T20:39:35.707 回答
0

嗯谢谢大家。这个罐子里好像有几只虫子。如果我使用正确的语法,我正在做的事情虽然不是最好的方式,但似乎会奏效。

但是我了解了 basename 并提高了我对 ln 的了解,所以我很高兴。

于 2009-07-31T04:33:50.633 回答
0

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

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

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

于 2009-09-11T04:48:33.880 回答