У меня есть длинный список папок, внутри каждой папки есть файл "log.dat". Я хотел прочитать значение определенной строки в этом файле. Я сохранил имена папок в файле "All.txt", в родительской папке, затем я запустил этот код:
#!/bin/bash
in=/a/b/c #path to the file All.txt
for i in $(cat $in/all.txt); do
sed -n '/price/p' ${in}/${i}/log.dat
done
Этот код смог прочитать почти все файлы, но по какой-то причине, которую я не могу понять!!! Он вывел следующее сообщение об ошибке:
/log.dat: No such file or directory #(then the path to this file)
Если я выполню команду sed -n '/price/p' log.dat
внутри папки, которая вывела сообщение об ошибке. Я получаю ответ!
PS:
Содержимое файла ALL.txt (который создается командой ls>All.txt
в родительской папке) следующее:
STR-548-021-01
STR-548-021-02
STR-548-022-01
STR-548-022-02
STR-548-023-01
STR-548-023-02
.
.
.
.
.
Я попытался использовать команду "awk" вместо "sed" следующим образом:
awk '{ price }' ${in}/${i}/log.dat
И я получил то же сообщение об ошибке.
Могут ли эти возвраты каретки происходить в Linux в качестве вывода для команды ls>All.txt?
В конце $ i
есть возврат каретки , потому что в конце строки в all.txt
. Вероятно, он был создан в Windows: Windows использует двухсимвольную последовательность CR, LF для обозначения разрыва строки, тогда как Unix (и большая часть остального мира) использует только LF (перевод строки, синоним новой строки в мире Unix), поэтому Unix видит строку с CR в конце.
Преобразуйте файл в окончание строки Unix или удалите CR:
for i in $(cat $in/all.txt); do
i=${i%$'\r'}
sed -n '/price/p' ${in}/${i}/log.dat
done
Это ничего не даст, если в конце строки нет CR. Объяснение: $ '\ r'
- это возврат каретки , а $ {i%…}
- это значение i
за вычетом указанного суффикса
Обратите внимание, что ваш сценарий ожидает ввода, разделенного пробелами, а не одного файла в строке, и ввод представляет собой список шаблонов подстановки, а не имена файлов. См. Почему мой сценарий оболочки подавляется пробелами или другими специальными символами? . Это не имеет значения, если во входных данных нет пробелов или подстановочных знаков.
Ваше сообщение об ошибке указывает на то, что sed получает аргумент /log.dat - ни $i, ни $in не имеют никакого значения. Я думаю, что у вас пустая строка в файле All.txt.
/log.dat: No such file or directory #(затем путь к этому файлу)