Предполагая, что вам нужно что-то более компактное / эффективное, вы можете использовать существующие инструменты (find, xargs) для создания конвейера, избавляя от необходимости программировать каждый шаг, используя bash.
Следующие файлы будут перемещеныв разделенную папку. Он найдет файлы, сгруппирует их по 50 в каждую папку, использует awk для создания выходной папки и переместит файлы. Решение не такое элегантное, как оригинал: - (
find 1 -type f |
xargs -L50 echo |
awk '{ print "CompliedOutput/temp/1-" NR, $0 }' |
xargs -L1 echo mv -t
В качестве примечания, текущий скрипт перемещает файлы из папки '1' в пронумерованные папки, а затем копирует файл обратно в оригиналПапка. Почему бы просто не скопировать файлы в пронумерованные папки. Вы можете использовать 'cp -p', чтобы сохранить метку времени, если это необходимо.
Поддержка имен файлов с новыми строками (и пробелами)
Пояснение к вопросу указывает, что решение должно работать с именами файлов со встроенными новыми строками (и пробелами). Это требует незначительных изменений для использования символа NUL в качестве разделителя.
# Count number of output folders
DIR_COUNT=$(find 1 -type f -print0 | xargs -0 -I{} echo X | wc -l)
# Remove previous tree, and create folder
OUT=CompiledOutput/temp
rm -rf $OUT
eval mkdir -p $OUT/1-{1..$DIR_COUNT}
# Process file, use NUL as separator
find 1 -type f -print0 |
awk -vRS="\0" -v"OUT=$OUT" 'NR%50 == 1 { printf "%s/1-%d%s",OUT,1+int(NR/50),RS } { printf "%s", ($0 RS) }' |
xargs -0 -L51 -t mv -t
Сделалограниченное тестирование с использованием как места, так и новых строк в файле. На моем компьютере выглядит нормально.