Добавьте все файлы, расположенные в пути, состоящем из символов дикой карты

#linux #bash #echo #wildcard

Вопрос:

Я пытаюсь добавить «aaa» в файлы «ami» без указания полного пути

Я попробовал это:

 echo "aaa" >> /home/thomas/*-bbb-*/ami
 

вместо того, чтобы вводить каждый путь отдельно, например /home/thomas/1-bbb-2/ami и /home/thomas/1-bbb-3/ami и так далее

Или я должен каким-то образом рекурсивно искать все файлы с именем «ami» в /home/thomas/ и добавлять их в переменную, а затем добавлять все эти файлы в эту переменную?

Комментарии:

1. Сколько у вас файлов? Ваш путь отличается только цифрами: 1-ввв-1, 1-ввв-2, 1-ввв-3 и т.д.?

2. Всего до 150 файлов. Я просто хочу сделать это более разумным способом, чем вводить каждый путь

3. Однако вы можете ударить, а можете и не ударить ARGMAX , сделав это.

4. files=(/home/thomas/[0-9]*-bbb-[0-9]*/ami); for f in "${files[@]}"; do echo 'aaa' >> "$f"; done Возможно, потребуется включить shopt -s nullglob

Ответ №1:

Попробуйте использовать цикл:

 for i in `seq 150` #change 150 to your value
do
echo "aaa" > /home/thomas/1-bbb-$i/ami
done
 

Это сработает, если ваши пути изменятся в одном месте (как в вашем примере).

Комментарии:

1. Путь меняется в 2 местах: /home/thomas/*-bbb-*/ami В противном случае ваше предложение сработает. Есть ли способ добавить файлы в переменную, а затем просто работать с ними? Потому что это не всегда будет 150 файлов, и на вашем пути будут ошибки, потому что он всегда будет искать ровно 150. Спасибо

Ответ №2:

Сохраните имена файлов в массиве.

 files=(/home/thomas/[0-9]*-bbb-[0-9]*/ami)

for f in "${files[@]}"; do echo 'aaa' >> "$f"; done