Я пытаюсь напечатать имена всех файлов .txt из текущей папки в одну строку. Я использую следующий скрипт. Однако он не печатает имена файлов.
REF_SEQ=""
find . -name "*.txt" -maxdepth 1 -type f |
while read f;
do
name=$(echo ${f}| xargs -I {} basename {} )
REF_SEQ+="${name} "
done
echo "Full Sequence: ${REF_SEQ}"
У меня есть 3-4 .txt файла в моей текущей папке (A.txt, B.txt ...). Я ожидаю вывод как
Полная последовательность: A.txt B.txt ...
Если я просто использую команду find
, не назначая вывод переменной RED_SEQ
, я получаю желаемый вывод. Это говорит о том, что команда find работает нормально, но я не могу присвоить ее переменной. Я пробовал разные операторы присваивания, но все равно не повезло.
Чтобы обновить переменную в bash
, вы должны использовать этот синтаксис:
VAR="some stuff$VAR"
Но, поскольку вы используете конвейер, цикл while
выполняется в под-оболочке, вы переменная потеряна.
Чтобы исправить это, вы должны иметь синтаксис:
while read f
do
done <<< $(input)
Итак, в вашем случае:
REF_SEQ=""
while read f;
do
name=$(echo ${f}| xargs -I {} basename {} )
REF_SEQ="${REF_SEQ}${name} "
done <<< $(find . -name "*.txt" -maxdepth 1 -type f)
echo "Full Sequence: ${REF_SEQ}"
Проблема в том, что вы используете {} за символом трубы. Это действительно только в опции -exec команды find, но не за символом канала.
Вы можете попробовать следующее:
REF_SEQ = $ (find. -Maxdepth 1 -name "* .txt" -type f -printf "% f" | xargs)
This должен дать желаемый результат. Директива printf% f выводит базовое имя найденного файла, а xargs «транспонирует» результат.
С наилучшими пожеланиями, Юрген