Справка скрипта Bash, включает подкаталоги для обработки файлов - PullRequest
1 голос
/ 22 января 2011

Я определенно новичок в написании сценариев. У меня есть скрипт, который обрабатывает некоторые файлы, и я не могу понять, как запустить его для всех файлов в каталоге, который имеет много подкаталогов и тысячи файлов. По сути, я хочу взять этот сценарий и запустить его для каталога с названием 2011 и обработать каждый файл в каждой подпапке.

#!/bin/bash
FILES=./userfiles/*
for f in $FILES
do
    echo ""
    echo ""
    echo "Processing File $f ...."
    echo ""
    echo ""
    make FILE_TYPE=user CSS_PATH=./log.css SCRIPT_PATH=./toggle.js SAXON_JAR=/opt/saxon/saxon9he.jar $f.html
    echo ""
    echo ""
    echo "File $f.html Generated"
done

Ответы [ 5 ]

1 голос
/ 22 января 2011

Следующий скрипт вернется в каждый каталог под ./userfiles и будет работать со всеми там файлами, даже с пробелами в их именах (или другими недостоверными символами).

Кроме того, при написании сценария make будет передано в качестве последнего аргумента имя файла, как оно отображается на вашем диске с добавлением .html.Например, файл ./userfiles/subdir/foobar.txt будет передан make как ./userfiles/subdir/foobar.txt.html.Если это не то, что вам нужно, то настройте ${file}.html соответственно.

Кроме того, если вы хотите, чтобы find - только работали с файлами, заканчивающимися, например, .htmlзатем вы можете добавить опцию -name "*.html" к команде find в любом месте после имени пути.

#!/bin/bash

topLevelDir="./userfiles"

while IFS= read -r -d $'\0' file; do
    echo 
    echo 
    echo "Processing File $file ...."
    echo 
    echo 
    make FILE_TYPE=user CSS_PATH=./log.css SCRIPT_PATH=./toggle.js SAXON_JAR=/opt/saxon/saxon9he.jar "${file}".html
    echo  
    echo  
    echo "File $file.html Generated"
done < <(find "$topLevelDir" -type f -print0)
0 голосов
/ 15 июля 2014

Вот функция, которая делает то, что вы просите, вы передаете ей папку, смотрите вызов внизу func_process_folder_set "/folder".

    # --- -------------------------------- --- #
    # FUNC:  Process a folder of files
    # --- -------------------------------- --- #
    func_process_folder_set(){

        FOLDER="${1}"

        while read -rd $'\0' file; do

            fileext=${file##*.}  # -- get the .ext of file
            case ${fileext,,}    # -- make ext lowercase for checking in case statement
            echo "FILE: $file"   # -- print the file  (always use " " to handle file spaces)

        done < <(find  ${FOLDER} -type f -maxdepth 20 -name '*.*' -print0)

    }

    # -- call the function above with this:
    func_process_folder_set "/some/folder"
0 голосов
/ 22 января 2011

Не уверен, что делает ваш скрипт, но чтобы запустить его для каждого файла в дереве, начиная с текущей папки, вы можете использовать:

find . -exec yourscript.sh {} \;
0 голосов
/ 22 января 2011

Поскольку ваш сценарий уже понимает один уровень расширения файла, возможно, запуск его в каждом каталоге, содержащем каталог ./userfiles, будет быстрым и простым ...

$ find . -type d -a -name userfiles -a -exec sh /whatever/myscript {}/.. \;
0 голосов
/ 22 января 2011

Попробуйте использовать команду find, чтобы получить список всех файлов и каталогов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...