脚本使用 dos2unix 转换文件

脚本使用 dos2unix 转换文件

我想创建一个脚本来监控我的本地文件夹,并且每次它收到以 开头的文件时frm*,就使用 进行转换dos2unix

该脚本始终在运行并不断转换已转换的相同文件,因此我认为这可能是一种改进。

我现在拥有的:

while true
do    
    dos2unix //path_to_folder/frm*    
done

有什么帮助吗?谢谢!

答案1

诀窍是每隔一定时间检查文件夹的内容,并将文件列表与上次检查进行比较。由于只需要转换新文件,因此可以跳过上次列表中已有的文件。

下面的脚本就是这么做的。它是用 Python 编写的,但无论用哪种语言,原理都是一样的。

它能做什么:

脚本启动时,会列出目录中的文件。
然后,每 5 秒循环一次:

  • 它检查其他文件
  • 如果发现了其他文件,则会转换这些文件,并跳过已存在的文件。
  • 它将最后检查的文件列表设置为“新的”初始文件列表。
#!/usr/bin/env python3

import subprocess
import time

directory = "/path/to/your/files"

def current_files():
    read = subprocess.check_output(["ls", directory]).decode("utf-8").strip()
    return [item for item in read.split("\n")]

initial_files = current_files()

while True:
    update = current_files()
    for item in update:
        if (item in initial_files, item.startswith("frm")) == (False, True):
            subprocess.call(["/bin/bash", "-c", "dos2unix", directory+"/"+item])
    initial_files = update
    time.sleep(5)

将脚本复制到一个空文件中,设置路径到您的文件夹,另存为convert.py,然后通过以下命令在后台运行该脚本:

python3 /path/to/convert.py

答案2

一种脆弱的方式inotifywaitawk

#!/bin/bash
DIR="/path/to/folder"
while FILE="$(inotifywait '$DIR'  -e close_write --format '%e,%f' | awk -F, '$NF ~ /^frm/{print $NF}')"
do     
    echo $FILE; 
    if [[ -f $FILE ]]
    then
        dos2unix "$DIR/$FILE"
    fi    
done

笔记:

  • 您需要安装inotify-tools

    sudo apt-get install inotify-tools
    
  • 这仅监视close_write事件,因此dos2unix会在创建或修改它的进程关闭文件后发生。

  • 您还可以使用该-r选项以递归方式查看目录。
  • inotifywait有一个--exclude接受 POSIX 扩展正则表达式的选项,但否定正则表达式(除之外的所有内容frm)很复杂,并且在中更容易完成awk
  • 如果文件名包含逗号,此操作将会中断,。在字符串中选择一个--format保证不会出现在文件名中的分隔符。

相关内容