linux - 从所有 txt 文件中查找作为参数给出的字符串的 Grep 文件,并将它们复制到另一个目录

标签 linux shell unix command-prompt

我必须将包含作为参数给出的字符串的所有 .txt 文件从当前目录复制到目标文件夹。

为了查找并显示这些文件,我使用了代码:

mkdir $1

for i in '*.txt'
do
    grep -r -l $2 > lines.log
done

但是我怎样才能复制这些文件呢?

最佳答案

观察结果:

  • 该代码似乎暗示目标目录 $1 并不 存在。不好,因为它可能存在。
  • 不需要循环。
  • 不需要像 >lines.log 这样的重定向。
  • 不需要 grep 递归 (-r) 选项,并且可能会导致问题。

代码:

  1. 简单,但仅适用于字母数字文件名:

    test -e "$1" || mkdir "$1"
    test -d "$1" && cp $(grep -l -s "$2" *.txt) "$1"
    

    注意那些测试。如果没有这样的文件(test -e),则创建 目的地。然后,如果目的地是 目录,复制文件。

    如果$1已经存在,但它不是目录,则不执行任何操作。

  2. 健壮(应该适用于所有文件名),但更晦涩:

    grep -Zsl "$2" | cpio -p0dmv ../"$1" 
    

    代码被盗自Adam Katz's answer to "grep file for string and copy directory to another directory" .

关于linux - 从所有 txt 文件中查找作为参数给出的字符串的 Grep 文件,并将它们复制到另一个目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48137300/

相关文章:

linux - CentOS7 中的 VPS,在启动我的 vps 时运行 Files JAVA

ruby - 如何清除 Ruby 控制台实用程序中的终端?

unix - 将版权信息插入多个文件

C++ 链接无法在从 Unix 到 Linux 的项目迁移中找到库

bash - ffmpeg 命令在 python 中使用时出错

linux - 为什么 cp 无法复制/proc/stat 文件?

linux - 如何使用sed提取数字

linux - shell,匹配终端输出中的字符串

linux - CentOS 8 上的头文件 socket.h 在哪里?

更改环境变量的 Linux shell 脚本