【问题标题】:Recursively find all directories that match a string, and symbolically link folder inside a new directory递归查找与字符串匹配的所有目录,并在新目录中符号链接文件夹
【发布时间】:2021-07-06 20:18:56
【问题描述】:

我有大量照片,按文件夹排序。我想编写一个脚本来搜索,找到匹配的文件夹名称,并创建指向新文件夹中匹配文件夹的符号链接。

类似这样的:

find /mnt/librarypool/user1/originals -type d -iname "*bbq*" -exec sh -c 'ln -s "{}" "/mnt/mediapool/bbq$("sh basename {}")"' \;

(这可行,但返回错误,“sh: cannot open basename: No such file or directory”)

这将在 /mnt/librarypool/user1/originals 中找到任何与“bbq”匹配的文件夹,并将在 /mnt/mediapool/bbq/ 中创建指向该文件夹的链接。

有没有更好的方法?我该如何清除该错误?

【问题讨论】:

    标签: linux bash unix freebsd


    【解决方案1】:

    你也许可以使用这个find 命令:

    find /mnt/librarypool/user1/originals -type d -iname "*bbq*" -exec bash -c \
    'for d; do ln -s "$d" "/mnt/mediapool/bbq/${d##*/}"; done' _ {} + 
    
    • + 在find 之后将传递找到的目录的多个参数
    • for d 将遍历这些条目
    • ${d##*/} 等同于 basename 命令,因为它会删除所有路径信息

    【讨论】:

    • 这很棒。谢谢。我如何扩展它以查找与 bbq 匹配的所有视频文件(.mov、*.avi 和 *.mp4)并将它们全部放在 bbq 内称为视频的平面文件夹中?目前,我正在做这样的事情: find /mnt/librarypool/user1/originals -ipath "*bbq.mov" -exec sh -c 'ln -s "{}" "/mnt/mediapool/bbq /-videos-$(sh basename {})"' \;这有效,但也如上所述返回错误。也没有办法将mov、avi、mp4组合成一行。并且为了避免重复,也许将目标文件名设置为原始文件夹名称?
    • 所有这些都可以在 shell 脚本中完成,但是对于你所问问题的性质来说改变太多了。为了能够匹配多个扩展,请使用:find /mnt/librarypool/user1/originals -type d -regextype awk -iregex '.*\.(avi|mp4|mov)$' -exec ...
    【解决方案2】:

    在我的系统上,至少ln 命令确实会在给定目录作为放置链接的位置时使用其目标的基本名称创建一个链接,所以这样的事情确实应该有效:

    find /mnt/librarypool/user1/originals \
      -type d -iname "*bbq*" \
      -exec ln -s {} /mnt/mediapool/bbq/ \;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      相关资源
      最近更新 更多