【问题标题】:Recursively listing symbolic links to a given folder with their full path递归列出指向给定文件夹的符号链接及其完整路径
【发布时间】:2013-11-30 15:10:10
【问题描述】:

我想遍历我的主文件夹并列出所有指向在其路径中包含 Dropbox 的元素的符号链接。以下命令(加上一些后期处理以删除额外的信息字段,但这应该不难)几乎完成了任务

ls -alR ~ | grep -e "->" | grep Dropbox

在我的ls 的输出中,标记-> 位于符号链接目标的路径之前。为了只获得指向 Dropbox 中某些内容的符号链接,我将输出传递给最终的 grep。但是有一个问题:这样我只得到符号链接的名称而不是它的完整路径。另一方面,使用如下命令:

ls -alR ~ | grep -e "->" | grep -E '(Dropbox|:)'

保留ls 的路径列表(在递归搜索中ls 首先输出列出的文件夹,后跟一个冒号)会导致太多的命中。有什么想法吗?

【问题讨论】:

  • 如果您必须处理恶意文件名(例如,包含-> 或换行符,有时甚至是空格和制表符的文件名),请注意解析ls 输出的困难。
  • 是的,这就是为什么您应该始终使用真正的编程语言(即不是 shell 脚本)来编写商业软件。但是对于一个快速的个人脚本,这可能没问题。
  • 对了,不要有太恶意的文件,个人用。如何突出显示消息中的代码部分?我已经看到你为我做了,谢谢!
  • 代码高亮——缩进(至少)4个空格。要快速执行此操作,请选择要缩进的代码,然后按编辑框上方的 {} 按钮。 (有传言说 control-K 组合也可以;我没用过。)
  • 如果您想查看恶意文件,请尝试运行此脚本(在垃圾目录中 - 不是其中包含有价值数据的目录):ls -la | while read -r line1 && read -r line2; do cp /dev/null $'\n'"$line1"$'\n'"$line2"; done。如果目录中有符号链接,它会“更好”工作。它几乎可以保证幼稚的 shell 脚本会严重失败。

标签: bash command-line ls


【解决方案1】:
find -type l -print0|xargs -0 ls -ld|grep Dropbox

【讨论】:

  • 我建议将-d 添加到ls 选项中,这样如果符号链接指向一个目录,您就不会得到该目录的列表。你也可以考虑find ~ -type l -exec ls -ld {} + | grep Dropbox。
  • @JonathanLeffler 谢谢,忘记了 -d 选项 - 我已将其合并到我的答案中。
  • 谢谢罗宾。几乎在那里,但它还列出了在链接路径而不是目标路径中具有 Dropbox 的文件。我尝试将 grep Dropbox 修改为 grep -E '.*->.*Dropbox' 但它不起作用 - 我不知道为什么。玩弄我发现 ls -l $(find ~ -type l) 2> /dev/null | grep -E '.*->.*Dropbox' > ~/Desktop/output.txt 即使不是很干净也可以工作: ls 抱怨某些东西不存在,所以我将 stderror 发送到 /dev/null
  • 实际上我的解决方案在包含空格的文件名上确实失败了。乔纳森回答我在上次 grep 中提出的更改似乎对我最有效:find ~ -type l -exec ls -ld {} + | grep Dropbox .
  • 好的,这是一个团队的努力! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
相关资源
最近更新 更多