Este funciona para um número arbitrário de arquivos e pode lidar com nomes de arquivos estranhos (aqueles que contêm espaços, novas linhas, barras invertidas ou outras estranhezas):
#!/usr/bin/env bash
## This will keep track of the number of files processed
num=0;
## This is used to choose the righht subdir
dir=1;
## The initial value of the target directory
target="subdir1"
for file in *; do
## Skip unless this is a file
if [ -f "$file" ]; then
## Create the target directory if it doesn't exist
[ -d "$target" ] || mkdir "$target"
## Move the current file
mv "$file" "$target"
## Change the target if we're at a multiple of 2500
if [[ $(( ++num % 2500 )) -eq 0 ]]; then
target="subdir"$((++dir));
fi
fi
done
Você também pode implementar a mesma coisa usando find
:
#!/usr/bin/env bash
## This will keep track of the number of files processed
num=0;
## This is used to choose the right subdir
dir=1;
## The initial value of the target directory
target="subdir1"
## Run your find, with -print0 to print NUL-separated values. This
## is needed for file names that contain newlines
find . -type f -print0 |
## The IFS= makes this deal with spaces, the -d '' sets the input delimiter
## to NUL so ti can work with -print0 and the -r makes it work with backslashes
while IFS= read -d '' -r file; do
## Create the target directory if it doesn't exist
[ -d "$target" ] || mkdir "$target"
## Move the current file
mv "$file" "$target"
## Change the target if we're at a multiple of 2500
if [[ $(( ++num % 2500 )) -eq 0 ]]; then
target="subdir"$((++dir));
fi
done
Salve esse script como ~/bin/batch_rename.sh
, torne-o executável ( chmod a+x ~/bin/batch_rename.sh
) e, em seguida, execute-o no diretório onde os arquivos estão .
NOTAS
-
O primeiro exemplo só encontrará arquivos no diretório atual. Para torná-lo recursivo, adicione esta linha ao início:
shopt -s globstar
Em seguida, altere o
for file in *
parafor file in **/*
. -
O segundo exemplo encontrará todos os arquivos neste e em qualquer subdiretório. Isso pode ou não ser o que você quer.