创建一个脚本,它将接受两个参数:
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 的关键;它允许您将移动的目标放在所有参数之前。
祝你好运。