
У меня есть около 9000 файлов в каталоге, и я хочу переместить их в 90 файлов в 100 каталогах в порядке имен файлов, игнорируя все остальное. ВКопировать несколько файлов из файла с именем X в файл с именем Y?,Калебнаписал вкомментарий:
Если цель состоит только в том, чтобы обработать их пакетно, есть НАМНОГО более простой способ!
ls | xargs -iX -n20 cp X target_folder/
Запускать cp для файлов пакетами по 20 штук, пока они все не будут обработаны.
Итак, основываясь на использовании xargs, как я могу переключить target_folder, чтобы создать новую папку и выполнить команду 100 раз?
решение1
В bash
, попробуйте следующий код :
#!/bin/bash
c=0
for f; do
if ! ((c % 100)); then
folder=folder_$(printf "%03d\n" $c)
mkdir -p $folder
fi
[[ -d "$f" ]] || mv "$f" "$folder"
((c++))
done
Запустите скрипт следующим образом:
./script.bash *
решение2
Эта команда не похожа на то, что вы пытаетесь сделать. xargs
может помочь, но ее неудобно использовать, если вы не знаете, что имена ваших файлов не содержат пробелов или символов кавычек. Вот цикл оболочки, который распределяет файлы по вновь созданным подкаталогам, по 90 на каталог.
set -- *
# Set args to "$1" "$2" ... "$90"
i=1 args=
while [ $i -le 90 ]; do
slice="$slice \"\${$i}\""
i=$((i+1))
done
# Move files 90 at a time
i=0
while [ $# -ge 90 ]; do
mkdir part$i
eval "mv $slice part$i"
shift 90
done
# 0 to 89 files remain in the current directory
решение3
parallel
поддерживает запуск нескольких команд с \;
и {#}
представляет собой порядковый номер:
ls|parallel -n90 mkdir {#}\;mv {} {#}
Или если имена файлов не содержат пробелов, кавычек или обратных косых черт:
i=1;while read l;do mkdir $i;mv $l $((i++));done< <(ls|xargs -n90)