我想创建一个脚本来监控我的本地文件夹,并且每次它收到以 开头的文件时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
一种脆弱的方式inotifywait
和awk
:
#!/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
保证不会出现在文件名中的分隔符。