Было бы, безусловно, быстрее, если бы 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/"