Слияние файлов (cat) в каждой папке Unix - PullRequest
0 голосов
/ 23 марта 2012

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

Итак, я пытаюсь сделать что-то вроде этого:

cd ../master-folder

for file in $( find . -name "*.txt" );
do
cat "all the text files in this sub folder" > "name of the subfolder.txt"
rm  "all the previous text files excluding the merged output obviously"
    done

Ценю помощь! Спасибо.

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

Я бы сделал это так, если порядок файлов не имеет значения:

for i in $(find -maxdepth 1 -mindepth 1 -type d)
do
    find $i -name '*.txt' -type f -exec cat {} >> $i-list.txt \;
    find $i -name '*.txt' -type f -exec rm {} \;
done

Первая находка ищет подкаталоги.

Второй добавляет все содержимое подфайла в файл

Третий удаляет подфайлы.

Это не работает, если есть рекурсивные подкаталоги. Если вы хотите это, удалите '-maxdepth 1'

2 голосов
/ 23 марта 2012

Почему бы не посетить каждый каталог рекурсивно?Что-то вроде:

#!/bin/bash                                                                     

shopt -s nullglob # Make failed globs expand to nothing

function visit {
    pushd "$1"
    txts=(*.txt)
    if ((${#txts[@]} > 0))
    then
        cat "${txts[@]}" > "${PWD##*/}.txt"
        rm -f "${txts[@]}"
    fi
    for dir in */
    do
        visit "$dir"
    done
    popd
}

visit /path/to/start/dir

Предостережение: Если у вас есть символические ссылки, которые создают циклы в вашем дереве каталогов, то это плохая идея.

...