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
如果上传了 .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