答案1
有些工具可以使重命名文件变得更加容易。例如,使用任何 Perlrename
实现,通常可以使用以下名称prename
:
prename '$dir = substr($_,0,3); mkdir $dir; $_ = "$dir/$_"' *.jpg
如果目录已经存在,您可以将其简化为
prename 's!(...)!$1/$1!' *.jpg
prename
例如,如果您的发行版不包含,请安装一个Unicode::争斗或者文件::重命名。
find
在这里可能没有用,因为文件都在同一目录中。但是,您可能会遇到错误,因为命令行太长。find
是解决这个问题的一种方法;您可以使用
find -maxdepth 1 -name '*.jpg' -exec prename 's!(...)!$1/$1!' {} +
autoload zmv # you can put this in ~/.zshrc
mkdir_mv () {
mkdir -p -- $2:h
mv -- $1 $2
}
zmv -p mkdir_mv '(???)*.jpg' '$1/$f'
如果目录已经存在,则可以仅使用
zmv '(???)*.jpg' '$1/$f'
答案2
src="/pathto/large_folder"
dest="/tmp/3chars"
mkdir -p "$dest" || exit 1
cd "$src" && \
find . -type f -name '???*' -exec sh -c '
for f
do
b=${f##*/}
d=${b%"${b#???}"}_.jpg
[ -d "$dest/$d" ] || mkdir -p "$dest/$d"
mv "$f" "$dest/$d/."
done
' x {} +