使用 Bash 将包含字符串的文件移动到目录中

使用 Bash 将包含字符串的文件移动到目录中

创建一个脚本,它将接受两个参数:

3.sh <directory> <destination>

在文件中搜索子<directory>字符串“运动”在文件内容中。

将包含字符串的文件移动到目录<destination>

我的狂欢

#!/bin/bash

if [ "$1" == "" ]; then
    echo "Retry..."
else
    if [ "$2" == "" ]; then
        echo "Retry ..."
    else
        echo "Try to fiend in folder {$1} files with this content {123} "
        grep -l "123" $1/*
        #grep -c "123" $1/*
    fi
fi

如何将找到的文件从一个目录转移到另一个目录?

答案1

str="moveme"
find "$1"/* -prune -type f -exec grep -l "$str" "{}" \; | xargs -i echo mv -i "{}" "$2"/

实际上,要检查参数的数量,检查 $2 就足够了

if [ "$2" == "" ]; then
        echo "Retry ..."

更重要的是,您应该处理 $2 中文件的可能覆盖。

答案2

grep将返回文件列表。您需要mv对每个文件执行。

您可以xargs按照另一个答案中的建议使用,但我更喜欢这个在线:

for file in $(grep -l "123" $1/*); do mv $file $2; done

它遍历返回的文件列表grep并逐个移动它们。

您可能需要添加一些错误检查,因此这里有一个更易读的版本:

for file in $(grep -l "123" $1/*); do
    mv $file $2;
done

另外,我发现在这种循环之前更改 IFS 变量通常是一个好主意

export IFS=$'\n'

这样,您将避免文件名称中包含空格的很多问题(除非它们嵌入了换行符)。

答案3

#!/bin/bash

if [ "$1" == "" ]; then
    echo "Retry... ./3.sh {folder_from}/ {text} {folder_to}/"
else
    if [ "$2" == "" ]; then
        echo "Retry ... ./3.sh {folder_from}/ {text} {folder_to}/"
    else
        echo "Try to find in folder {$1} files with this content {123} "
        cd ~/tasks/$1
        grep -l "123" * > list.txt
        while read line
        do
            name=$line
            mv $line  ~/tasks/$3/$line
        done < list.txt
        #grep -c "123" $1\/*
        rm list.txt
    fi
fi

答案4

这个问题有一些有趣的解决方案。这个是一行代码,虽然它会为目录生成一些错误(grep 无法在其中搜索您的搜索文本),但它应该可以完成您的任务。

grep -l --null 'moveme' "${1}"/* | xargs -0 mv --target-directory="${2}"

如果您希望它是对源目录的递归搜索,那么更好的解决方案是:

grep -l --recursive --null 'moveme' "${1}" | xargs -0 mv --target-directory="${2}"

这两者都假设 grep、xargs 和 mv 的实现质量较高,但是我们在 Linux 中已经有这样的选项很久了。

我没有测试过这个语法,但前提是:

搜索“moveme”中列出的文件,并仅输出匹配文件的文件名 (-l),以空字符 (--null) 分隔。

该过程的输出进入 xargs,它使用 -0 参数知道使用空字符作为分隔符,并将列出的文件作为参数传递给 mv 命令。

最后一部分是 --target-directory 参数,它是使用 mv 和 xargs 的关键;它允许您将移动的目标放在所有参数之前。

祝你好运。

相关内容