cat несколько файлов в отдельных каталогах file1 file2 file3 .... file100, используя скрипт l oop in bash - PullRequest
1 голос
/ 17 января 2020

У меня есть несколько файлов в нескольких каталогах, как в каталоге 1 / file1 2 / file2 3 / file3 ...... 100 / file100. Я хочу упаковать все эти файлы в один файл, используя l oop over index в bash script. Легко ли l oop для этого?

Спасибо,

Ответы [ 3 ]

3 голосов
/ 17 января 2020
seq 100 | sed 's:.*:dir&/file&:' | xargs cat
  • seq 100 генерирует список чисел от 1 до 100
  • sed
    • s замен
    • : разделяет части команды
    • .* вся строка
    • : разделитель. Обычно используется /, но используется в строке замены.
    • dir&/file& на dir<whole line>/file<whole line>
    • : разделитель
    • , поэтому он генерирует список dir1/file1 ... dir100/file100
  • xargs - передать ввод в качестве аргументов ...
    • cat - чтобы он выполнил cat dir1/file1 dir2/file2 ... dir100/file100.
2 голосов
/ 17 января 2020

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

for((i=1;i<=`ls -l | wc -l`;i++)); do cat dir${i}/file${i} >> output; done
1 голос
/ 17 января 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

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

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}/*
...