【问题标题】:Move files containing X but not containing Y移动包含 X 但不包含 Y 的文件
【发布时间】:2014-08-13 05:27:28
【问题描述】:

为了管理我的备份同步文件夹,我试图提出一个命令,它将以string1* 开头但不以*string2 结尾的文件从/folder1 移动到/folder2

包含这两个相反条件(HAS 和 HAS NOT)的命令会是什么样子?

【问题讨论】:

  • string1 和 string2 有哪些参数?文件有多大?它们是文本还是二进制?这听起来像是使用一些正则表达式和 unix 工具可以相当容易地完成的事情,具体取决于您的答案。

标签: file unix find move


【解决方案1】:
#!/bin/bash
for i in `ls -d /folder1/string1* | grep -v 'string2$'`
do
   ls -ld $i | grep '^-' > /dev/null # Test that we have a regular file and not a directory etc.
   if [ $? == 0 ]; then
      mv $i /folder2
   fi
done

【讨论】:

    【解决方案2】:

    试试类似的东西

    find /folder1 -mindepth 1 -maxdepth 1 -type f \
    -name 'string1*' \! -name '*string2' -exec cp -iv {} /folder2 +
    

    注意:如果您有旧版本的 find,您可以将 + 替换为 \;

    【讨论】:

    • BroSlow,我是否正确地需要将“-exec cp”替换为“-exec mv”来移动文件,而不是复制它们?另外,如果我运行这个命令(cp 或 mv),我会得到 find: missing argument to `-exec'
    • @lockheed 我会做mv -iv,添加一些详细信息,以防/folder2 中已有任何重复文件。如果您的find 不占用+,请使用\;。
    【解决方案3】:

    对我来说,这是(我将表示)read while 模式的另一种情况。

    cd /folder1
    ls string1* | grep -v 'string2$' | while read f; do mv $f /folder2; done
    

    其他答案是不错的选择,特别是find 可以做很多很多。但是我总是对使用find 感到头疼,而且在没有打开联机帮助页的情况下,我从来没有完全使用过它。

    另外,从ls 或简单的find 开始获取文件列表,然后使用sed、awk、grep 中的任何一个或全部进行调整/trim/extend 这个列表,然后把它塞进一个循环中,是一种粗略的(ish)但非常强大的技术。

    【讨论】:

    • find 确实使避免错误情况变得容易得多。例如这将无法获取点文件、包含换行符的文件、以- 开头的文件以及包含无关空格的文件。其中一些可以修复,但不是全部,这就是为什么解析 ls 是 generally viewed as bad。
    • 当然,我同意——你所说的一般来说都是正确的,如果我在脚本的某个深处这样做,那么我会使用find -print0 和更高级的read。但大多数时候(一次性)我不需要捕获病态的文件名,但确实想对文件名进行一些简单的转换,而不会出现非平凡的find 调用产生的标点符号爆炸。它是 unix:“粗鲁但非常强大”是关键思想!
    猜你喜欢
    • 2018-09-06
    • 2011-01-10
    • 1970-01-01
    • 2022-07-21
    • 2018-07-08
    • 2011-04-02
    • 2012-02-13
    • 1970-01-01
    相关资源
    最近更新 更多