cat несколько файлов в отдельных каталогах файл1 файл2 файл3файл100 с использованием цикла в сценарии bash

У меня есть несколько файлов в нескольких каталогах, например, в каталоге 1/файл1 2/файл2 3/файл3 ...... 100/файл100. Я хочу объединить все эти файлы в один файл, используя цикл по индексу в сценарии bash. Есть ли простой цикл для этого?

Спасибо,


person whoami    schedule 17.01.2020    source источник
comment
Итак, вы хотите cat */file*?   -  person KamilCuk    schedule 17.01.2020
comment
100 каталогов/файлов следуют какому-то правилу или они совершенно случайны? Например. dir{ID}/file{ID}?   -  person Kent    schedule 17.01.2020
comment
Спасибо за ваши комментарии. Да, все файлы следуют за каталогом1/файл1, каталогом2/файл2, каталогом3/файл3.....каталог100/файл100. Вот почему я хочу зациклить скрипт bash вместо того, чтобы делать cat dir1/file1 dir2/file2 ... dir100/file100 › file   -  person whoami    schedule 17.01.2020
comment
Ах, вы хотите добавить их в числовом порядке вместо 1 10 2 20 3 ... ? Легче всего правильно переименовать их все с ведущими нулями 001 и т. д. В противном случае просто for dir in 1 2 3 4 5 6 7 8 9 .... 100 ; do cat $dir/* ; done > outFile. Удачи.   -  person shellter    schedule 17.01.2020


Ответы (3)


seq 100 | sed 's:.*:dir&/file&:' | xargs cat
  • seq 100 генерирует список чисел от 1 до 100
  • sed
    • s substitutes
    • : разделяет части команды
    • .* вся линия
    • : разделитель. Обычно используется /, но он используется в строке замены.
    • dir&/file& by dir<whole line>/file<whole line>
    • : разделитель
    • поэтому он генерирует список dir1/file1 ... dir100/file100
  • xargs - pass input as arguments to ...
    • cat - so it will execute cat dir1/file1 dir2/file2 ... dir100/file100.
person KamilCuk    schedule 17.01.2020

Этот код должен помочь;

for((i=1;i<=`ls -l | wc -l`;i++)); do cat dir${i}/file${i} >> output; done
person Nitish    schedule 17.01.2020
comment
Я хочу, чтобы кошка работала в последовательном порядке. Я имею в виду, что cat должен работать как cat dir1/file1 dir2/file2 dir3/file3 › newfile, чтобы в новом файле были файлы в порядке file1file2file3.... - person whoami; 17.01.2020
comment
@whoami - это фактические имена файлов и каталогов dir1, dir2, file1 и file2? - person Nitish; 17.01.2020
comment
dir1, dir2 — это каталоги, в которых находятся файлы с именами file1 file2 соответственно. - person whoami; 17.01.2020
comment
Я только что попробовал следовать одному из ваших предложений, и похоже, что это работает. для ((i=1;i‹=54;i++)); сделать кот ./$i/cartkpt$i; готово › CARTKPT - person whoami; 17.01.2020

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

for ((i=1;i<=100;i++)); do 
  mkdir "$i" && touch "$i/file$i" && echo content of "$(pwd) $i" > "$i/file$i"
done

Проверьте созданные каталоги.

ls */*

ls */* | sort -n

Если вы видите, что каталоги и файлы созданы, переходите к следующему шагу.

Это решение не требует какой-либо внешней команды из оболочки, кроме, конечно, cat :-)

Теперь мы можем проверить содержимое каждого файла, используя синтаксис bash.

i=1
while [[ -e "$i" ]]; do
  cat "$i"/*
  ((i++))
done

Этот код был протестирован в тире.

i=1
while [ -e "$i" ]; do
  cat "$i"/*
  i=$((i+1))
done

Просто добавьте перенаправление вывода в файл после завершения. Вы можете добавить еще несколько тестов, если хотите, см. help test

Еще одна вещь :-), вы можете просто проверить содержимое, используя tail и фигурную скобку expansion

tail -n +1 {1..100}/*

Используя cat, вы также можете перенаправить вывод, просто помните, что brace expansion — это функция/синтаксис bash3+.

cat {1..100}/*
person Jetchisel    schedule 17.01.2020