[英]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个值( hello
, world
和hey there
),而是循环了4个值( hello
, world
, hey
和there
)。
要解决此问题,我们可以做两件事:
将IFS
设置为仅换行符:
IFS=" " ls -1 /var/text.old | while read file ...
通常,我喜欢在脚本开始时将IFS
设置为换行符,因为我认为这样做稍微“安全”些,但是对此的看法可能会有所不同。
但是更好的是不解析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.