Сценарий Bash для сортировки файлов по папкам в алфавитном порядке

Если вы хотите запускать последовательно, код выхода — это все, что вам нужно;

command && echo "it worked"

или

command || echo "we are having a bad day"

Если терминал gnome -или sshpass не возвращают правильный код возврата, отправьте отчет об ошибке и используйте альтернативу.

Если вы хотите работать параллельно, используйте xargs-P или parallel , где

exit status is the combination of the exit statuses of each command ran, ORed together. (Thus, if any one command exits nonzero, parallel as a whole will exit nonzero.)

Если одна из ваших команд возвращается до выполнения, используйте альтернативу или заставьте свои команды использовать шаблон асинхронного проектирования (re -изобрести колесо ), например, добавив

 ; echo $(date) $? > task1.r

затем ожидание завершения всех задач;

while [ $(cat task*.r 2>/dev/null | wc -l) -lt $TASK_COUNT ] ; do
    sleep 1
done
grep -P " [^0]$" task*.r && echo "we are having a bad day"

0
01.03.2020, 23:07
1 ответ

Ваш сценарий выбирает каталоги , а также файлы, не являющиеся каталогами -, и перемещает их в подкаталоги на основе их имен, даже если они представляют собой однобуквенные каталоги -, по которым мы сортируем вещи. в. Так появляются новые каталоги. Ваш код также без необходимости использует sedи trи т. д., чтобы делать то, что оболочка bashможет делать сама по себе быстрее и безопаснее, и lsникогда не следует использовать в скриптах для перебора имен файлов (, см., например. "Почему *не *parse `ls`(и что делать вместо )?"почему ).

Другая проблема заключается в том, что если у вас есть много тысяч файлов с именами, начинающимися с одного и того же символа, то команда mv "$first"* tmp/(или втораяmv)могут завершиться ошибкой «слишком длинный список аргументов» (. ] см. например " Слишком длинный список аргументов для ls "; проблема относится и к mv, а не только кls).

Пример скрипта, который устраняет эти проблемы и использует только функциональные возможности bash, кроме mkdirи mv:

.
#!/bin/bash

shopt -s nullglob  # makes the loop not loop at all if there are no files

for name in *; do
    if [[ -d $name ]] && [[ $name == ? ]]; then
        # skip directories that have single character names
        continue
    fi

    # get first character in filename
    first=${name:0:1}

    # compute destination directory name from this first
    # character by uppercasing it
    destdir=${first^}

    # make that directory if it does not already exist
    mkdir -p -- "$destdir"

    # move the file into place (name collisions not checked for)
    mv -- "$name" "$destdir"
done

Параметры --в вызовах mkdirи mvпредназначены для защиты от имен файлов, которые могут начинаться с тире (, см., например,. " Что означает " --" (двойное -тире )? " ).

Основное отличие этого скрипта в том, что я перебираю имена в каталоге, а не первые символы, как вы.

4
28.04.2021, 23:21

Теги

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