如果有.wav文件上传,我有一个文件夹。触发进度以转换文件。这必须递归完成。
如果添加或更改了文件,我使用inotifywait启动该过程,然后我想使用if语句比较文件扩展名。
但是,与其比较{}的值,它不尝试调用带有用{}替换的字符串名称的函数。这可能是我的if条件的问题。
我的管道在这里:
inotifywait -mrq -e create -e moved_to --format '%f' ./ | xargs -I {} bash -c "if '{}' =~ *.wav ; then echo {} ; fi"
我应该如何比较存储在{}中的字符串的扩展名?
答案 0 :(得分:0)
两个主要问题是
if
本身只能检查以下命令的退出状态,somefile =~ *.wav
通常不是命令,而[[ ... =~ ... ]]
是。=~
使用的扩展正则表达式与glob有所不同。要匹配所有以字面量为.wav
结尾的文件,您必须编写.*\.wav$
。inotifywait -mrq -e create -e moved_to --format '%f' ./ |
xargs -I {} bash -c "if [[ '{}' =~ .*\.wav$ ]]; then echo {}; fi"
但是,此命令仅适用于没有特殊符号的简单文件名。例如,如果文件名中只有一个'
,它就会中断。写会更安全
... | xargs -I {} bash -c 'if [[ "$1" =~ .*\.wav$ ]]; then printf %s\\n "$1"; fi' -- {}
您还可以使用简单快捷的替代方法
... | grep -E '\.wav$'
答案 1 :(得分:0)
如果您打算按某些扩展名进行过滤,请查看https://unix.stackexchange.com/questions/323901/how-to-use-inotifywait-to-watch-a-directory-for-creation-of-files-of-a-specific
如果您有更复杂的逻辑来处理不同的文件扩展名,则可以将代码编写为
inotifywait -mrq -e create -e moved_to --format '%f' ./ | while read line; do
fullname=$(basename -- $line)
extension=${fullname##*.}
filename=${fullname%.*}
echo "fullname=$fullname"
echo "filename=$filename"
echo "extension=$extension"
# now you can do more things with either $filename or $extension
if [ "$extension" == "wav" ]; then
echo "to process $fullname"
fi
done