Сценарий для предварительного ожидания пути файлов к файлу рекурсивно

find [path] -name [filename]

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

find /home -name *foo*

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

2
13.04.2017, 15:36
2 ответа

Можно работать student_head когда в папке для автоматического добавления имени папки как заголовка в записываемые файлы в нем и его подкаталогах:

student_head_action() {
    # We can't use parameter expansion on $PWD because of recursion
    local _dirname="${1%/*}"
    _dirname="${_dirname##*/}"

    [[ -d $1 ]] && return 0
    if ! [[ -w $1 && -f $1 ]]; then
        printf '%s\n' "$1 does not exist or is not writeable, skipping"
        return 1
    fi
    bash -c "ed -s {} <<< $'0a\n'"# Student: ${_dirname}"$'\n.\n,s/\r//g\nw'"
}

student_head() {

    local _file
    if (( $# )); then
        for _file; do
            student_head_action "${_file}" || _retval=1
        done
    else
        if shopt -s globstar > /dev/null 2>&1; then
            for _file in **/*; do
                student_head_action "${_file}" || _retval=1
            done
           shopt -u globstar
        else
            printf '%s\n' 'Globstar isn't available, attempting to use GNU find...'
            find . -type f -writable -exec bash -c '
                _dirname="${1%/*}\
                _dirname="${_dirname##*/}\
                ed -s "$1" <<< '"$'0a\n'"'"# Student: ${_dirname}"'"$'\n.\n,s/\r//g\nw'" {} \;
        fi                
    fi

    return "${_retval-0}"
}

Вставьте эти функции Ваш ~/.bashrc если Вы хотите student_head всегда быть доступным для Вашего пользователя при использовании bash.

student_head может быть назван двумя способами:

  1. Без аргументов. В этом режиме всем записываемым файлам в текущем каталоге и его подкаталогах предварительно ожидали заголовок.
  2. С именами файлов как аргументы. В этом режиме только файлам, перечисленным в аргументах, предварительно ожидали заголовок.

Если файл в аргументах не существует, student_head возвращает статус выхода 1.

Нужно упомянуть, что этот сценарий использует globstar, который требует bash>=4.0.

5
27.01.2020, 21:53
  • 1
    Спасибо за быстрый ответ! Я проложил себе путь через Ваш код, и я вполне уверен, я понимаю то, что он делает на каждом шаге. Эта функция только работает из студенческого каталога, и я хочу смочь работать, это от выравнивает и имеет его шаг вниз в каждый студенческий каталог и добавляет комментарии. –  Matt 16.09.2011, 20:24
  • 2
    Вы, вероятно, используете старую версию. Я исправил ошибку рекурсии некоторое время назад. Что касается ^M (который является \r), я не могу воспроизвести это. Это, вероятно, указывает, что Вы имеете ed неправильно сконфигурированный. –  Chris Down 16.09.2011, 20:26
  • 3
    Вы читаете комментарий слишком быстро. Файлы происходят из систем окон, который является, где большинство проблем ^M происходит. Я не видел их в файле до выполнения функции, но выполнение dos2unix на исходном файле так или иначе зафиксировало их обнаруживающийся в получающемся файле. –  Matt 16.09.2011, 20:31
  • 4
    я добавил в команде для изменения \r\n кому: \n, и исправил ошибку с именованием. А-ч –  Chris Down 16.09.2011, 20:37
  • 5
    . Вы изменили второе "_dirname =..." Я пытался выяснить, какова точка первой была. –  Matt 16.09.2011, 20:39

Вот объединение решения find и ed.

add_header() {
   declare regex IFS='|'
   (( $# )) && regex="^($*)$" || regex=""
   find "$PWD" -type f -exec bash -c ' 
      ( exec grep -E -qs -e "$0" <<<"${1##*/}" ) || exit
      _dirname="${1%/*}"
      _dirname="${_dirname##*/}"
      exec ed -s "${1}" <<EOF
0a
# Student: ${_dirname}
.
wq
EOF
   ' "${regex:-.+}" '{}' \;
   return 0
}

add_header                    # all files in current directory recursively
add_header file1 file2 file3  # only named files in current directory recursively
2
27.01.2020, 21:53
  • 1
    find "$PWD" бессмысленно, просто используйте find .. Кроме того, Вы, кажется, неправильно понимаете использование exec (это не должно использоваться таким образом, Вы используете его). Нет также никакой потребности в wq, с тех пор EOF завершения stdin (и завершения как таковые ed). Вам также не удается объяснить провал - а именно, в минимуме, необходимо, по крайней мере, проверить, что указанный файл является и регулярным и перезаписываемым. –  Chris Down 16.09.2011, 21:28

Теги

Похожие вопросы