如何创建目录列表的符号链接?

时间:2014-05-09 00:24:40

标签: linux bash

我必须移动$HOME/.directories,因为我的分区错误。

我移动到另一个具有更多可用空间的分区。但我想做一个象征性的联系,但我不能。因为当我尝试类似的东西时:

for file in `ls -la | awk '{print$09}'`; do sudo ln -sf "$PWD/$file" /home/inukaze/$file; done

usage: sudo [-D level] -h | -K | -k | -V
usage: sudo -v [-AknS] [-D level] [-g groupname|#gid] [-p prompt] [-u user name|#uid]
usage: sudo -l[l] [-AknS] [-D level] [-g groupname|#gid] [-p prompt] [-U user name] [-u user name|#uid] [-g groupname|#gid] [command]
usage: sudo [-AbEHknPS] [-C fd] [-D level] [-g groupname|#gid] [-p prompt] [-u user name|#uid] [-g groupname|#gid] [VAR=value] [-i|-s]
            [<command>]
usage: sudo -e [-AknS] [-C fd] [-D level] [-g groupname|#gid] [-p prompt] [-u user name|#uid] file ...

我需要正确读取符号链接的完整路径。而我这不起作用。如何创建文件夹列表以“dot”(.)开头,并在我的主目录中创建符号链接?

我试过的Okey朋友:

1:

for file in `ls -la "$PWD" | awk '{print$09}' | grep "^\."` ; do `sudo ln -sf $("$PWD/$file") $"("/home/inukaze/$file")"` ; done

2:

MYDIR="/media/Compartido/.linux/Home/Inukaze"
DIRS=`ls -la "$MYDIR" | egrep '^d' | awk '{print $9}'`
for DIR in $DIRS ; do sudo ln -sf "$PWD/$DIRS" "/home/inukaze/$DIRS" ; done

3:

find . -type d -maxdepth 1 |while read DIRNAME; do sudo ln -s "${DIRNAME}" /home/inukaze/"${DIRNAME}"; done

但是使用三种方法,我得到了相同的结果,很多不好的符号链接,只有6种是正确的。我不明白为什么。

出了点问题,我开始认为是在

  

“sudo ln -s $ Varible”$ Destiny;完成“

好吧。另一个想法???

4 个答案:

答案 0 :(得分:1)

shopt -s dotglob
cp -s * ~inukaze

答案 1 :(得分:1)

嗯。不是100%清楚你要实现的目标或者它无法正常工作,但我写了这个尝试根据你的示例代码进行调试。注意我现在使用的是echo而不是ln -s,并且将file更改为大写FILE并用括号和双引号括起来:

for FILE in `ls -la | awk '{print$09}'`;
do
  echo "${PWD}/${FILE}" /home/inukaze/"${FILE}"
done

在我的本地系统 - Mac OS X 10.9上 - 它输出:

/Users/jake/.bash_history /home/inukaze/.bash_history
/Users/jake/.bashrc /home/inukaze/.bashrc
/Users/jake/.cache /home/inukaze/.cache
/Users/jake/.gitk /home/inukaze/.gitk
/Users/jake/.htoprc /home/inukaze/.htoprc
/Users/jake/.mysql_history /home/inukaze/.mysql_history
etc…

所以不清楚你的脚本是如何工作的?你只想要目录吗?还是文件?

编辑:原始海报只关注符号链接目录。因此,请尝试使用find代替:

find . -type d -maxdepth 1 |\
  while read DIRNAME
  do
    echo "${DIRNAME}" /home/inukaze/"${DIRNAME}"
  done

就我而言,它会像我一样找到当前主目录中的所有目录,并在此之后回显/home/inukaze/"${DIRNAME}

./.ssh /home/inukaze/./.ssh
./.subversion /home/inukaze/./.subversion
./.Trash /home/inukaze/./.Trash
./.Xcode /home/inukaze/./.Xcode
./Applications /home/inukaze/./Applications
./Desktop /home/inukaze/./Desktop
./Documents /home/inukaze/./Documents
etc…

在这个例子中,我只是使用echo来测试整体逻辑。这是find使用-type d选项,告诉它只找到目录,-maxdepth 1连接到最大深度find应该去。执行1深度不会探索比您所在目录更深的任何目录。

答案 2 :(得分:0)

  

我如何制作文件夹列表以&#34; dot&#34;开头。 (。)

shopt -s dotglob
echo .*/ # This glob matches only dot-directories; however that includes ./ and ../
  

并在我的主目录中创建符号链接?

shopt -s dotglob
for d in "$PWD"/.*/; do
  case "$d" in
    *./|*../) :;; # do nothing for these two directories
    *) ( cd && ln -s "$d" );;
  esac
done

上述内容比Ignacio Vazquez-Abrams' answer更详细,但也只链接...以外的点目录。它也适用于BSD / OSX。

答案 3 :(得分:0)

我认为问题在于

<强> ls -la | awk '{print$09}'

因为所有文件夹都以&#34; /&#34完成;和&#34; ln -sf&#34;如果在结束中添加/,则不创建符号链接

我尝试

<强> ls -la | awk '{print$09}' | sed 's/\/*$//

仅用于删除ls -la

中的最后一个字符 我认为我解决了

我转到我的备份文件夹,在这种情况下为/media/Compartido/.linux/Home/Inukaze

$ for file in $(ls -la | awk '{print$09}' | sed 's/\/*$//') ; do sudo ln -sf "$PWD/$file" "/home/inukaze/$file" ; done

<强> ln: <</home/inukaze/./.>> : cannot overwrite a directory

<强> ln: <</home/inukaze/../..>> : cannot overwrite a directory


并准备好所有符号链接:=)