Bash:使用xargs和if语句比较名称

时间:2018-11-22 20:30:41

标签: bash xargs

如果有.wav文件上传,我有一个文件夹。触发进度以转换文件。这必须递归完成。

如果添加或更改了文件,我使用inotifywait启动该过程,然后我想使用if语句比较文件扩展名。

但是,与其比较{}的值,它不尝试调用带有用{}替换的字符串名称的函数。这可能是我的if条件的问题。

我的管道在这里:

inotifywait -mrq -e create -e moved_to --format '%f' ./ | xargs -I {} bash -c "if '{}' =~ *.wav ; then echo {}  ; fi"

我应该如何比较存储在{}中的字符串的扩展名?

2 个答案:

答案 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