繁体   English   中英

RH Linux Bash脚本帮助。 需要移动文件中带有特定单词的文件

[英]RH Linux Bash Script help. Need to move files with specific words in the file

我有一个RedHat linux框,过去我曾经写过一个脚本来将文件从一个位置移动到另一个位置,并在文件的主体中带有特定的文本。

我通常每年只写一次脚本,所以每年我都会忘记越来越多...话虽如此,

去年,我编写了此脚本并使用了它,并且效果很好。

由于某种原因,我无法使其今天正常工作,我知道这是一个简单的问题,我什至不应该寻求帮助,但由于某种原因,我今天并没有正确地看待它。

这是脚本。

ls -1 /var/text.old | while read file
do
grep -q "to.move" $file && mv $file /var/text.old/TBD
done

我列出了/var/text.old目录中的所有文件。 我正在读取每个文件,然后在“ to.move”中查找并整理结果,然后将找到的结果文件移动到文件夹/var/text.old/TBD中

我是管理员,并且拥有上述文件和文件夹的权限。 我可以在每个文件中看到数据,也可以手动对其进行MV处理,我已经使用pwd来获取目录的正确拼写。

如果有人可以帮助我看看我在这里想念的到底是什么,那真的会让我过得愉快。

提前致谢。


更新:

我需要移动的文件没有空格。

我收到的错误如下:

grep:9829563.msg:没有这样的文件或目录

注意:文件“ 982953.msg”是我需要移动的文件之一。 另请注意:我列出的目录中的每个文件都收到此错误。

您没有发布任何错误,但是我要猜​​测一下,您的文件名带有空格或特殊的Shell字符。

假设您有3个文件,而ls -1给了我们:

hello
world
hey there

现在, while拆分特殊的$IFS变量的值,该变量默认情况下设置为<space><tab><newline>
因此,您不会像您期望的那样循环3个值( helloworldhey there ),而是循环了4个值( helloworldheythere )。

要解决此问题,我们可以做两件事:

  1. IFS设置为仅换行符:

     IFS=" " ls -1 /var/text.old | while read file ... 

    通常,我喜欢在脚本开始时将IFS设置为换行符,因为我认为这样做稍微“安全”些,但是对此的看法可能会有所不同。

  2. 但是更好的是不解析ls的输出,并将其for

     for file in /var/text.old/*`; do 

    这不会派生任何外部进程( while启动2时将ls插入到ls ),并且在其他方​​面的表现也就“不足为奇”。 请参阅此处的一些示例


第二个问题是您没有引用$file 出于相同的原因,您应该始终用双引号引用路径名: "$file" 如果$file带有空格(或特殊的外壳字符,例如* ,则命令的含义将更改:

file=hey\ *
mv $file /var/text.old/TBD

成为:

mv hey * /var/text.old/TBD

这显然与您的预期有很大不同! 您的意图是:

mv "hey *" /var/text.old/TBD

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM