У меня есть каталог файлов со структурой, как показано ниже:

./DIR01/2019-01-01/Log.txt
./DIR01/2019-01-01/Log.txt.1
./DIR01/2019-01-02/Log.txt
./DIR01/2019-01-03/Log.txt
./DIR01/2019-01-03/Log.txt.1
...
./DIR02/2019-01-01/Log.txt
./DIR02/2019-01-01/Log.txt.1
...
./DIR03/2019-01-01/Log.txt

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

cd ./DIR01/2019-01-01/
cat Log.txt.4 Log.txt.3 Log.txt.2 Log.txt.1 Log.txt > ../../Log.txt_2019-01-01_DIR01.txt

(Я понимаю , что данная команда выдаст ошибку , что некоторые файлы не существуют, но cat будет делать то , что мне нужно от него в любом случае) Помимо cd ать в каждую директорию и работает вышеупомянутую команду cat как я могу сценарий этого в Скрипт Bash?

2 ответа2

0

Как обычно для Linux, есть несколько возможных способов сделать то, что вы просите.

Например, используя глобальное расширение bash для запуска скрипта во всех папках:

for dir in */* ; do                             # iterate through all 2nd-level subdirectories 
    if [ -d "$dir" ] ; then                     # only run on folders
        cat $dir/Log.txt* > Log.txt_${dir////_} # that mess of slashes replaces them with underscores in the filename
    fi
done

В качестве альтернативы вы можете использовать find:

for dir in $(find -mindepth 2 -maxdepth 2 -type d)
    cat $dir/Log.txt* > Log.txt_${dir////_}
done

Или, возможно, любое количество других решений.

0

Спасибо, но решение, которое я нашел в StackOverflow, заключалось в использовании следующего кода:

for dir in DIR*/*; do 
    date=${dir##*/}; 
    dirname=${dir%%/*}; 
    cat $dir/Log.txt.{5..1} $dir/Log.txt > Log.txt_"${date}"_"${dirname}".txt; 
done

Это объединит файлы в обратном порядке, что мне и нужно (извините, если это не ясно).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .