gpt4 book ai didi

linux - 检查是否存在文件名包含空格的文件

转载 作者:IT王子 更新时间:2023-10-29 01:12:55 29 4
gpt4 key购买 nike

我正在 Bash 中测试文件是否存在,文件名使用 $(printf '%q' "$FNAME") 进行转义。

如以下注释示例所示,使用 if [ -f $FNAME ] 总是会产生错误。如何测试包含空格和其他字符的文件名?

#!/usr/bin/env bash

# code used in Raspberry Pi Podcasting Jukebox project
# youtube-dl -f 17 --get-filename https://www.youtube.com/watch?v=AgkM5g_Ob-w
# returns "HOW ABUNDANCE WILL CHANGE THE WORLD - Elon Musk 2017-AgkM5g_Ob-w.3gp"

# Purpose: To test if file exists before downloading
# for testing purposes using an existing regular file "abc def ghi"
AFILE="abc def ghi"
TFILE=$(printf '%q' "$AFILE") # Escaping filename using printf
echo $TFILE # returns abc\ def\ ghi
# if [ -f $AFILE ] # this test returns false every time with error [:too many arguments

if [ -f $TFILE ] # This test also returns FALSE with err [: too many arguments
then
echo "Existing"
# don't download
else
echo "Not existing"
# youtube-dl http://www.youtube.com/watch?v=AgkM5g_Ob-w
fi

最佳答案

始终引用您的文件名,使用 %q 转义空格的想法是正确的,但是当与 [ 运算符一起使用时,未引用的 $ TFILE 被拆分为多个单词,导致 -f 操作数在实际需要单个参数时接收到太多参数。因此,一旦您对它进行双引号,空格就会被保留下来,并且在条件语句中传递一个文字单个参数。

testFile="abc def ghi"
printf -v quotedFile '%q' "$testFile"

if [ -f "$quotedFile" ]; then
printf 'My quoted file %s exists\n' "$quotedFile"
fi

以上应该适用于任何 POSIX 兼容的 shell([ 的用法)。但是,如果您的目标脚本仅用于 bash shell,则可以使用 [[,其中永远不需要引号,因为它被评估为表达式。所以你可以这样做

file_with_spaces="abc def ghi"
if [[ -f $file_with_spaces ]]; then
printf 'My quoted file %s exists\n' "$file_with_spaces"
fi

但一般来说,在 bash 中为变量添加引号并没有坏处。你总能做到。

关于linux - 检查是否存在文件名包含空格的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47788046/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com