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

Bash: Comparing names using xargs and if statement

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

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

但是,它没有比较 {} 的值,而是尝试调用一个函数,其中字符串的名称被 {} 替换。这可能是我的if条件的问题。

我的管道在这里:

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

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

两个主要问题是

  • 你忘记戴牙套了。 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 [[ "" =~ .*\.wav$ ]]; then printf %s\n ""; fi' -- {}

您也可以使用更简单、更快速的替代方法

... | grep -E '\.wav$'

如果您打算按特定扩展名进行过滤,请查看 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