【问题标题】:Check if file exist in one folder, if not copy it and rename it. (tricky timestamp in name)检查文件是否存在于一个文件夹中,如果不存在则复制并重命名。 (名称中的棘手时间戳)
【发布时间】:2021-04-13 17:46:04
【问题描述】:

我想检查 awstats012021.blalblalblala.txt 是否在我的目录中,如果是我想将其重命名为 awstats012021.blalblalblala-主要.txt。

如何检查所有这些文件以及何时有新文件。我总是想用 -main.txt 版本重命名(复制)它。特别是如果您必须考虑标题中的日期。

-rw-r--r-- 1 root   root   9233 Apr  7 17:08 awstats012021.blalblalblala-main.txt
-rw-r--r-- 1 root   root   9233 Mar  1 14:25 awstats012021.blalblalblala.txt
-rw-r--r-- 1 root   root  12986 Mar  2 00:00 awstats022021.blalblalblala-main.txt
-rw-r--r-- 1 root   root  12986 Mar  2 00:00 awstats022021.blalblalblala.txt
-rw-r--r-- 1 root   root  37865 Apr  2 00:00 awstats032021.blalblalblala-main.txt
-rw-r--r-- 1 root   root  37865 Apr  2 00:00 awstats032021.blalblalblala.txt
-rw-r--r-- 1 root   root  16036 Apr  7 00:00 awstats042021.blalblalblala-main.txt
-rw-r--r-- 1 root   root  23983 Apr 13 00:00 awstats042021.blalblalblala.txt
-rw-r--r-- 1 root   root   9463 Mar  1 14:25 awstats112020.blalblalblala-main.txt
-rw-r--r-- 1 root   root   9463 Mar  1 14:25 awstats112020.blalblalblala.txt
-rw-r--r-- 1 root   root  21645 Mar  1 14:25 awstats122020.blalblalblala-main.txt
-rw-r--r-- 1 root   root  21645 Mar  1 14:25 awstats122020.blalblalblala.txt

awstats 和 blalblablala 是固定字符串。只有数字 012021 不是,它总是月份和年份。所以我们需要一个通配符。我只需要签入一个目录。我认为在这个例子中,零文件匹配也是可能的,但是当创建一个名为“awstats052021.blalblalblala.txt”的新文件时,我想自动将其重命名为“awstats052021.blalblalblala-main.txt”。

for awstats??????.blalblalblala.txt in /srv/www/example/storage/logs/awstats
                if not exist awstats??????.blalblalblala-main.txt
                               cp -p awstats??????.blalblalblala.txt awstats??????.blalblalblala-main.txt
                not if 
                echo "no file to copy!"

exit

【问题讨论】:

标签: bash shell date sed


【解决方案1】:

注意:我假设您要重命名文件,因此使用mv。 如果需要副本,请替换为 cp。你的问题令人困惑 那一点。

试试这个:

#!/bin/bash

dir="/srv/www/example/storage/logs/awstats"

while IFS= read -r -d $'\0' filename
do
    # get the filename without the extension
    filename_noext=${filename%.txt}
    # new filename has -main added to it, plus the extension
    newfilename="${filename_noext}-main.txt"

    # if the newfilename does not exist, create it from the original file (mv deletes that original file)
    if [[ ! -f "$newfilename" ]]
    then
        echo "Changing file $filename to $newfilename"
        mv $filename $newfilename
    else
        echo "File $newfilename already exists"
    fi
done < <(find "$dir" -type f -name "awstats*.blalblalblala.txt" -print0)

详情:

  • find 使用 -print0 选项以 \0 字符分隔找到的每个文件。
  • read 使用 -d $'\0' 选项读取每个文件名,使用 \0 作为文件名之间的分隔符。
  • 这确保了带有空格的文件仍然被正确处理。在您的情况下并不是严格要求的,但最好尽可能展示最通用的示例。请参阅此http://mywiki.wooledge.org/BashFAQ/020 了解完整的讨论。
  • find 使用-name 选项指定要处理的文件。在您的问题中,所有文件都以“awstats”开头并以“.blalblalblala.txt”结尾,所以一个简单的* 就足够了。
  • ${filename%.txt} 使用 bash 变量扩展来删除文件名中的扩展名“.txt”。

因此,该脚本会将每个文件 awstat*.blalblalblala.txt 重命名为与添加 -main 相同的文件。

现在,如果您想让它在创建新文件时自动运行,您有两种选择:

  1. 使用 cron 并以固定的时间间隔运行它(例如每 5 分钟一次)。
  2. 如果您需要准实时,请查看inotify。更复杂的是,只有在您必须对文件创建做出快速反应的情况下才采用此方法。

【讨论】:

    猜你喜欢
    • 2013-08-14
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 2015-11-19
    • 2018-12-26
    • 2014-08-20
    • 1970-01-01
    相关资源
    最近更新 更多