【问题标题】:Moving files with a certain extension using grep使用 grep 移动具有特定扩展名的文件
【发布时间】:2020-04-05 01:13:06
【问题描述】:

我正在尝试移动扩展名为 .txt 的文件。

ls /original/file/path | grep .txt

这成功列出了带有 txt 扩展名的文件。但是,当我执行以下操作时:

mv `ls /original/file/path | grep .txt` /the/new/path

我收到一条错误消息:

mv: cannot stat 'test.txt': No such file or directory

我遇到这个错误有什么原因吗?

【问题讨论】:

  • 不要解析ls的输出。它容易出错,而且不需要。只需mv *.txt /the/new/path
  • 我很抱歉 - 我应该提到这将在脚本中,所以我不能只使用 mv 命令。我必须先找到文件然后移动它们。

标签: linux command line


【解决方案1】:

为此我会使用find:

 find /original/file/path/ -maxdepth 1 -name '*.txt'  -exec mv {} /the/new/path/ \;

解释参数:

  • /original/file/path/中查找文件
  • 仅在当前文件夹中(find 将深入到树中)
  • 名称为*.txt
  • 并执行命令mv{} 替换为找到的每个文件。

【讨论】:

    【解决方案2】:

    这是因为 ls 进入目录会从文件中删除路径,即从文件名中删除原始路径。所以 mv 命令实际上是在当前目录中查找 test.txt ,因此报错。

    您可以使用通配符,

    mv `ls /original/file/path/*.txt` /the/new/path
    

    【讨论】:

      【解决方案3】:

      简单地使用 mv 和通配符 *.txt 来匹配所有文本文件会更容易,例如

      mv /original/file/*.txt /the/new/path
      

      但如果您真的必须使用 grep,您可以使用 xargs 将其通过管道传输到 mv

      ls /original/file/path | grep .txt | xargs -I% mv % help/
      

      使用 xargs 的 I 标志表示您将使用以下字符来指定文件的管道位置,而我使用 % 字符。但是,只有在您出于某种原因需要使用 grep 或 ls 时才应该使用它,但它经常会出错。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-29
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 2023-03-15
        • 2020-06-06
        • 2011-02-14
        相关资源
        最近更新 更多