
Я пытаюсь напечатать имена всех .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 работает нормально, но я не могу присвоить ее переменной. Я пробовал разные операторы присваивания, но все равно безуспешно.
решение1
Чтобы обновить переменную в 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}"
решение2
Проблема в том, что вы используете {} после символа вертикальной черты. Это допустимо только в опции -exec команды find, но не после символа вертикальной черты.
Вы можете попробовать следующее:
REF_SEQ=$(find . -maxdepth 1 -name "*.txt" -type f -printf "%f " | xargs)
Это должно дать желаемый результат. Директива printf %f выводит базовое имя найденного файла, а xargs «транспонирует» результат.
С наилучшими пожеланиями Юрген