У меня есть несколько файлов в нескольких каталогах, например, в каталоге 1/файл1 2/файл2 3/файл3 ...... 100/файл100. Я хочу объединить все эти файлы в один файл, используя цикл по индексу в сценарии bash. Есть ли простой цикл для этого?
Спасибо,
У меня есть несколько файлов в нескольких каталогах, например, в каталоге 1/файл1 2/файл2 3/файл3 ...... 100/файл100. Я хочу объединить все эти файлы в один файл, используя цикл по индексу в сценарии bash. Есть ли простой цикл для этого?
Спасибо,
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
.Этот код должен помочь;
for((i=1;i<=`ls -l | wc -l`;i++)); do cat dir${i}/file${i} >> output; done
Я привел пример того, что вы описываете в своей структуре каталогов и файлах. Создавайте каталоги и файлы с собственным содержимым.
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}/*
cat */file*
? - person KamilCuk   schedule 17.01.2020dir{ID}/file{ID}
? - person Kent   schedule 17.01.20201 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