我有多个文件夹,其中包含 JAN/ Jan/ FEB/ Feb/ MAR/ Mar/ 等子文件夹。我需要将所有文件从 JAN/* 移动到 Jan/ ,FEB/* 移动到 Feb/ 等等。如何使用 shell 脚本实现此目的?
编辑
感谢@Costas 为我指明了正确的方向。他的解决方案适用于 Bash 4 及更高版本。因为我有 v3,所以我最终使用了这个。
for DIR in [A-Z][A-Z]*/
do
NEWDIR=`echo "$(echo "$DIR" | sed 's/.*/\L&/; s/[a-z]*/\u&/g')"`
mv $DIR/* $NEWDIR
done
sed 脚本取自这里。
答案1
对于现代bash
(支持大小写更改):
for dir in [A-Z][a-z]*/
do
mv -t "$dir" ${dir^^}/*
done
在不受支持的版本中您可以自由使用tr
| sed
|... 改为转换。
答案2
使用基于 Perl 的rename
实用程序(在 Debian 上作为标准配置,但prename
在某些其他系统上也被称为该实用程序),您可以通过一个命令来完成此操作
( LC_ALL=C; prename -v 's!^([A-Z])([A-Z]{2}/)!$1\L$2!' [A-Z][A-Z][A-Z]/* )
这会强制C
区域设置,从而确保文件名匹配区分大小写,从而允许文件模式[A-Z][A-Z][A-Z]
仅选取完全大写字母的月份。该替换将三个大写字母替换为一个大写字母后跟两个小写字母。
如果您愿意,可以将文件名模式交换[A-Z][A-Z][A-Z]/*
为所有十二个月的明确列表:{JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC}/*