2012-05-09 3 views
2

Вопрос может быть тривиальным, но я не могу заставить его работать. Я просто хочу объединить 2 конкретных файла, присутствующих в нескольких конкретных папках, в новый отдельный файл снова в каждой конкретной папке.Кошка с шаблоном

cat */folder_*/*/file.a */folder_*/*/file.b > */folder_*/*/file.c 

, но это не работает потому

-bash: */folder_*/*/file.c: No such file or directory 

Так что я подумал, может быть, по какой-то причине cat не может создавать файлы (хотя он делает), поэтому я попытался

touch */folder_*/*/file.c; cat */folder_*/*/file.a */folder_*/*/file.b > */folder_*/*/file.c 

но опять же он не работает с cat или даже touch.

+0

Я никогда не использовал кошку с такой штукой. Я предлагаю вам использовать find, а затем pipe with cat. Пример: find -name 'file.a' | cat> blablabla – Depado

ответ

1
for dir in */folder_*/*; do 
    [[ -d "$dir" ]] && (cd "$dir" && cat file.a file.b > file.c) 
done 

Я бегу cd && cat в субоболочке так что вам не придется кд туда, где вы начали.

1

Вы не можете использовать глобусы для целевого файла. Вы должны полностью указать имя файла. Это не имеет никакого отношения к cat конкретно.

+0

Итак, единственная альтернатива, которую я могу придумать, - это перебрать все каталоги и подкаталоги с помощью 'ls', создать и сохранить весь путь, а затем выполнить команду' cat' для каждого экземпляра файла. О, ну ... во всяком случае. – lorendarith

+0

@lorendarith: Не выполняйте цикл с 'ls' - используйте globbing' для f в * ' –

2

Возможно, вам нужно что-то подобное;

for a in */folder_*/*/file.a; do 
    # maybe continue if b missing 
    cat "$a" "${a%.a}.b" >"${a%.a}.c" 
done 

Подстановочные знаки и перенаправления обрабатываются оболочкой; cat не имеет понятия подстановочных знаков и не знает, куда вы отправляете свой вывод.

Смежные вопросы