在unix中写入文件

在unix中写入文件

我在 unix 中写入文件时遇到一些问题

[ -s $PWD/MEN/*sub.wav ] && echo "File there" || echo "File Not there" > temp.csv

我正在尝试这个 unix 命令,但它没有写入文件 temp.csv。

答案1

temp.csv命令中写入的唯一内容是最后一个,只有在测试或第一个测试失败echo时才会执行它。-secho

要正确输出到文件,请执行以下操作

if [ -s MEN/*sub.wav ]; then echo "File there"; else echo "File not there"; fi >temp.csv

或(不完全等同),

[ -s MEN/*sub.wav ] && echo "File there" >temp.csv || echo "File not there" >temp.csv

另请注意,如果您的模式MEN/*sub.wav匹配多个文件名,则会在程序中生成语法错误。

您想测试一下是否最后一个name 与模式匹配,并且非空(-s测试),然后使用

set -- MEN/*sub.wav

# Loop over the matching names (if any).
# Stop when we find a non-empty file.
while [ "$#" -gt 0 ] && [ ! -s "$1" ]; do
     shift
done
if [ -s "$1" ]; then
    echo File exists
else
    echo File not there
fi >temp.csv

您想测试一下是否全部与模式匹配的名称非空:

set -- MEN/*sub.wav

# Loop over the matching names (if any).
# Stop when we find an empty file.
while [ "$#" -gt 0 ] && [ -s "$1" ]; do
     shift
done
if [ "$#" -eq 0 ]; then
    echo File(s) exists
else
    echo File(s) not there
fi >temp.csv

最后一段代码依赖于 shell 保留未展开的模式,以防出现匹配的名字。

答案2

如果你破坏了你的命令,那么这些是等效的

[ -s $PWD/MEN/*sub.wav ]

如果您的模式“$PWD”/MEN/*sub.wav 不匹配多个文件名,它无论如何都会执行。然后来了

echo "File There"

shell 尝试执行此命令,在您的情况下,它已成功执行,然后出现||这意味着如果左侧部分失败,则执行右侧部分。当我们的左侧部分被执行时,右侧部分将永远不会被执行。如果你想写文件在那里到 temp.csv 那么你的命令看起来像

[ -s $PWD/MEN/*sub.wav ] && echo "File there" > temp.csv || echo "File Not there" > temp.csv

或者如果你想写这两部分

[ -s $PWD/MEN/*sub.wav ] && echo "File there" > temp.csv && echo "File Not there" > temp.csv

相关内容