Найдите файлы с аналогичными именами в папке с помощью сценария оболочки

Существует два случая, где я нахожу : полезный:

Переменные присвоения по умолчанию

#!/bin/sh

# set VAR to "default value" if not already set in the environment
: "${VAR=default value}"

# print the value of the VAR variable.  Note that POSIX says the behavior
# of echo is implementation defined if the first argument is '-n' or if any
# argument contains a '\', so use printf instead of echo.
printf '%s\n' "VAR=${VAR}"

Это - удобный способ позволить пользователям Вашего сценария оболочки переопределять установку, не редактируя сценарий. (Однако параметры командной строки лучше, потому что Вы не рискуете неожиданным поведением, если у пользователя по совпадению есть переменная, Вы используете в их экспортируемой среде.) Вот то, как пользователь переопределил бы установку:

VAR="other value" ./script

${VAR=value} синтаксис говорит для установки VAR кому: value если VAR уже не установлен, затем расширьтесь до значения переменной. Так как мы просто еще не заботимся о значении переменной, это передается как аргумент никакой-op команде : выбрасывать его.

Даже при том, что : не-op команда, расширение выполняется оболочкой (не : команда!) прежде, чем работать : управляйте, таким образом, переменное присвоение все еще происходит (если применимо).

Также было бы приемлемо использовать true или некоторая другая команда вместо :, но код становится более твердым читать, потому что намерение менее ясно.

Следующий сценарий также работал бы:

#!/bin/sh

# print the value of the VAR variable.  Note that POSIX says the behavior
# of echo is implementation defined if the first argument is '-n' or if any
# argument contains a '\', so use printf instead of echo.
printf '%s\n' "VAR=${VAR=default value}"

Но вышеупомянутое намного более трудно поддержать. Если использование строки ${VAR} добавляется выше этого printf строка, расширение присвоения по умолчанию должно быть перемещено. Если разработчик забывает перемещать то присвоение, ошибка представлена.

Что-то, чтобы вставить пустой условный блок

Пустых условных блоков нужно обычно избегать, но они иногда полезны:

if some_condition; then
    # todo:  implement this block of code; for now do nothing.
    # the colon below is a no-op to prevent syntax errors
    :
fi

Некоторые люди утверждают что, имея пустое истинное if блок может сделать код легче читать, чем отрицание теста. Например:

if [ -f foo ] && bar || baz; then
    :
else
    do_something_here
fi

возможно легче читать, чем:

if ! [ -f foo ] || ! bar && ! baz; then
    do_something_here
fi

Однако я полагаю, что существует несколько альтернативных подходов, которые лучше, чем пустой истинный блок:

  1. Поместите условие в функцию:

    exotic_condition() { [ -f foo ] && bar || baz; }
    
    if ! exotic_condition; then
        do_something_here
    fi
    
  2. Поместите условие в фигурных скобках (или круглые скобки, но круглые скобки порождают процесс подоболочки, и любые изменения, внесенные в среду в подоболочке, не будут видимы вне подоболочки) перед отрицанием:

    if ! { [ -f foo ] && bar || baz; } then
        do_something_here
    fi
    
  3. Использовать || вместо if:

    [ -f foo ] && bar || baz || {
        do_something_here
    }
    

    Я предпочитаю этот подход, когда реакция является простой остротой, такой как утверждение условий:

    log() { printf '%s\n' "$*"; }
    error() { log "ERROR: $*" >&2; }
    fatal() { error "$@"; exit 1; }
    
    [ -f foo ] && bar || baz || fatal "condition not met"
    

-2
22.02.2013, 08:50
3 ответа

Можно использовать шарик как так:

mv S-000001-*.xml dir-to-move-to
1
28.01.2020, 05:16
  • 1
    Привет Chris, спасибо за быстрый ответ. Да Ваше предложение будет работать, но только для одного ID.There тысяча другого идентификатора. Я должен переместить все файлы. Если я буду использовать вышеупомянутый метод, он только переместит один подобный идентификатор не весь идентификатор –  user32885 22.02.2013, 08:40
  • 2
    @user32885 - О, я вижу - Ваш идентификатор является второй частью имени файла; это не казалось ясным из Вашего вопроса. Посмотрите мое редактирование, оно должно сделать то, что Вы хотите. No-Chris –  Chris Down 22.02.2013, 08:42
  • 3
    , Айдахо является первой частью имени файла. Это - идентификатор клиента для сотрудника банка. Мы получаем файл именем S-083344-0-0.xml, если у этого клиента будет общий счет затем, то мы получим файлы по имени S-083344-0-0.xml, S-083344-0-0.xml, S-083344-0-2.xml. Надеюсь теперь, что у Вас есть моя точка. Таким образом, я должен переместить файлы общего счета, а также единственной идентификационной учетной записи. Единственный идентификатор не будет иметь 2-й части как-1,-2,-3, это будет просто S-083884-0-0.xml. Идентификатор зафиксировал 6 символов после S –  user32885 22.02.2013, 08:50
  • 4
    @user32885 я смущен. Вы говорите, что "идентификатор зафиксировал 6 символов после S-", но Вы также говорите, что идентификатор не является второй группой..., когда группа после S-является второй группой. –  Chris Down 22.02.2013, 09:10
for x in `ls S*.xml | egrep -o '[0-9]{6}' | sort | uniq`; do mkdir -p /tmp/$x; cp S-$x-* /tmp/$x/.; done

Это создаст папку ID (для каждого идентификатора) в/tmp и затем скопирует там все файлы с тем же идентификатором.

Можно заменить cp с mv если тесты в порядке.

Я предположил, что идентификатор имеет 6 цифр, и все другие числа меньше.

1
28.01.2020, 05:16
find /path/to/old/directory -name 'S-??????-?-?.xml' -type f -print0 | \
    xargs -r0 mv -vt /path/to/new/directory
0
28.01.2020, 05:16
  • 1
    Насколько я могу сказать, что вторая часть имени файла является идентификатором, таким образом, это переместится слишком много. –  Chris Down 22.02.2013, 09:09

Теги

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