用于在两个目录之间移动文件的 Shell 脚本

用于在两个目录之间移动文件的 Shell 脚本

我有多个文件夹,其中包含 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}/*

相关内容