使用 grep 移动具有特定扩展名的文件

Moving files with a certain extension using grep

我正在尝试移动扩展名为 .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 命令实际上是在当前目录中寻找 test.txt,因此出现错误。

您可以使用通配符,

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

简单地使用 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 时才应使用它,但它经常会出错。

为此我会使用 find:

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

解释参数:

  • /original/file/path/
  • 中查找文件
  • 仅在当前文件夹中(find 如果需要,可以深入目录树)
  • 姓名为*.txt
  • 并执行命令 mv 用找到的每个文件替换 {}