У меня есть каталог, содержащий около 24800 .mp4 файлов, как я могу разделить его на 4 каталога, соответствующих всем файлам, не сохраняя оригинальные файлы 24800 в одном каталоге? Есть ли какая-либо команда mv / move, чтобы сделать это?
Если в именах файлов нет системы, позволяющей перемещать части файлов с использованием подстановочных знаков, я бы использовал текстовые инструменты bash для создания списка файлов в текстовом файле:
ls > filelist.txt
затем разделите это в разных частях, затем для каждой части используйте sed
, чтобы отредактировать каждую строку, чтобы она составляла команду перемещения, например
filename.mp3
становится
mv "filename.mp3" targetdir
Эти текстовые файлы затем могут быть получены из командной строки для автоматического выполнения каждой команды по перемещению файла в другую папку. Если, например, такой текстовый файл называется "part_1", то вы можете получить этот файл как:
. part_1
или
source part_1
. В качестве альтернативы вы можете сделать такой файл, содержащий допустимые команды, исполняемым, и выполнить его. Тогда желательно добавить shebang ( #! / Bin / bash
) в качестве первой строки файла.
Вы можете удалить / BIN / ECHO
, когда вы чувствуете, что сценарий делает то, что вы ожидаете его делать
#!/bin/bash
a=(source/*)
for ((b=0, c=$((${#a[@]} / 4)),d=0; b < ${#a[@]}; b+=c)); do
mkdir -p target/$((++d))
printf %s\\0 "${a[@]:$b:$c}" | xargs -r -0 /bin/echo mv -t target/$d --
done
#!/bin/bash
# Paste this to a file and make the file executable using chmod +x filename
# Run the script file like so ./filename or bash filename
# This will create 4 new directories in the current directory where you run the script
# It will move the files from the source directory to the new directories and split them equally ~
# Change source_dir/ below to the path of your source directory.
source_dir="source_dir/"
file_extension="mp4"
drectories=4
file_num="$(ls -l $source_dir | wc -l)"
max_files="$(($file_num/$drectories))"
max_files2="$max_files"
dir_num=1
i=0
mkdir -p new_dir"$dir_num"
for f in "$source_dir"*".$file_extension"
do
if (($dir_num == $drectories))
then
# Remove echo below when satisfied with output to do the actual moving
echo mv "$f" new_dir"$dir_num"
else
(($i == $max_files2)) && ((dir_num++)) && max_files2="$(($max_files2+$max_files))" && mkdir -p new_dir"$dir_num"
# Remove echo below when satisfied with output to do the actual moving
echo mv "$f" new_dir"$dir_num"
((i++))
fi
done