Files

在 unix 中寫入文件

  • June 22, 2020

我在用 unix 寫入文件時遇到了一些問題

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

我正在嘗試這個 unix 命令,但它沒有寫入文件 temp.csv。

如果你破壞你的命令,那麼這些是等價的

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

如果您的模式 “$PWD”/MEN/*sub.wav 不匹配多個文件名,它將無論如何都會執行。然後來了

echo "File There"

外殼嘗試執行此命令,在您的情況下,它已成功執行然後來||這意味著如果左側部分失敗,則執行右側部分。由於我們的左側部分被執行,那麼右側部分將永遠不會被執行。如果你想在那裡寫文件到 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

在您的命令中寫入的唯一內容temp.csv是 last echo,只有在-s測試或第一個echo失敗時才會執行。

要正確輸出到文件

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匹配多個文件名,這將在您的程序中生成語法錯誤。

您想測試是否至少有一個名稱與模式匹配,並且是非空的(-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 保留未擴展的模式,以防沒有匹配的名稱。

引用自:https://unix.stackexchange.com/questions/594344