gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:36:46 25 4
gpt4 key购买 nike

我有一台 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

我是管理员,我拥有上述文件和文件夹的权限。我可以看到每个文件中的数据我可以手动移动它们我已经使用 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

    这不会派生任何外部进程(通过管道从 lswhile 从 2 开始),并且在其他方​​面表现得“不那么令人惊讶”。 See here for some examples .

<小时/>

第二个问题是您没有引用 $file 。您应该始终用双引号引用路径名:"$file"出于同样的原因。如果$file有空格(或特殊的 shell 字符,例如 * ,命令的含义会发生变化:

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

变成:

mv hey * /var/text.old/TBD

这显然与您的预期非常不同!您的意图是:

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

关于linux - RH Linux Bash 脚本帮助。需要移动文件中含有特定单词的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31323263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com