Как ускорить этот сценарий Bash mv? - PullRequest
0 голосов
/ 06 мая 2020

Добрая душа из этой ветки написала для меня сценарий:

# Run from search root
cd "O:\folder"
# Change this to taste
export NEWDIR=Gallery

find . | egrep '(mp4$|jpg$|png$)' |
while read FILE
do
[[ $FILE = *Journal* ]] && continue

BASEDIR=$(dirname "$FILE")
echo Moving $FILE from $BASEDIR to $NEWDIR
mkdir "$BASEDIR/$NEWDIR" > /dev/null 2>&1
mv "$FILE" "$BASEDIR/$NEWDIR"

done

Проблема в том, что у меня есть миллионы файлов (примерно в 16 000 папок), которые нужно запустить через это, однако, когда я запускаю этот скрипт, он обрабатывается медленно. За 6 часов было обработано всего 224 папки (около 10 000 изображений / видео).

Есть ли способ ускорить это?

Также: для:

[[ $FILE = *Journal* ]] && continue

Как изменить эту строку, чтобы игнорировать несколько папки?

1 Ответ

4 голосов
/ 06 мая 2020

Было бы, безусловно, быстрее, если бы find выполнял фильтрацию за вас:

NEWDIR='Gallery'
find \
  . \
  -type f \
  -iregex '.*\.\(mp4\|jpg\|png\)$' \
  -not -iregex '.*Journal.*/.*' \
  -printf '%h\0%p\0' |
    xargs -0 -n2 sh -c 'echo mkdir -p -- "$2/$1"; echo mv -- "$3" "$2/$1/"' _ "$NEWDIR"

Удалите echo, когда вас удовлетворит результат.

Альтернативный метод с -execdir:

NEWDIR='Gallery'
find . \
  -type f \
  -iregex '.*\.\(mp4\|jpg\|png\)$' \
  -not -iregex '.*Journal.*/.*' \
  -execdir sh -c 'new_dir="$1"; shift; echo mkdir -p -- "$new_dir"; echo mv -- "$@" "$new_dir/"' _ "$NEWDIR" "{}" +

С -execdir сценарий bash запускается cd из того же каталога, что и все файлы, найденные в этом каталоге. Таким образом, сценарий запускается один раз для каждого каталога.

Вот сценарий оболочки, который запускается с -execdir:

# The new directory name is passed as first argument.
new_dir="$1"

# Remove the first argument from the arguments array,
# so it contains only file names.
shift

# Create the new directory.
mkdir -p -- "$new_dir"

# Move all the files from the argument array,
# into the new directory.
mv -- "$@" "$new_dir/"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...