Запись в файл в unix

Я столкнулся с некоторыми проблемами при записи файла в unix

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

Я пробую эту команду unix но он не пишет в файл temp.csv.

0
22.06.2020, 17:36
2 ответа

Единственное, что пишет в temp.csvв вашей команде, — это последний 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

Этот последний фрагмент кода основан на том, что оболочка сохраняет нерасширенный шаблон в случае отсутствия совпадающих имен.

3
18.03.2021, 23:25

Если вы нарушите свою команду, то они эквивалентны

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

Он будет выполнен в любом случае, если ваш шаблон "$PWD"/MEN/ *sub.wav не соответствует более чем одному имени файла. Затем идет

echo "File There"

Оболочка пытается выполнить эту команду, и в вашем случае она была выполнена успешно, а затем появляется ||Это означает, что если левая часть не удалась, то выполнить правую часть. Поскольку наша левая часть выполняется, правая часть никогда не будет выполнена. Если вы хотите записать File там в 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
2
18.03.2021, 23:25

Теги

Похожие вопросы