我有一个文件夹里面有很多文件夹,每个文件夹都包含一个电影文件。现在我希望能够一次看到所有这些电影(但我必须保留文件夹结构),所以我想将它们全部符号链接到顶级文件夹(目录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表达式有效,但我显然已经用变量搞砸了。
由于
答案 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 标志允许您在每次找到文件时运行另一个进程。如上所述放入一对花括号以将该文件作为参数提供给该进程。我花了一些时间来确定在转义分号之前需要有一个空格。