根据条件重命名 Linux 中的文件名
Rename file names in Linux based on conditions
我在 Linux 目录中有一些文件,如下所示。
email_Tracking_export_2018_08_26.zip
email_Tracking_export_2018_08_27.zip
email_Tracking_export_2018_08_28.zip
email_Tracking_export_2018_08_29.zip
email_Tracking_export_2018_09_03.zip
email_Tracking_export_history_Novemeber.zip
email_Tracking_export_history_December.zip
email_Tracking_export_history_january.zip
email_Tracking_export_history_february.zip
email_Tracking_export_history_march.zip
email_Tracking_export_history_April.zip
现在我想将文件名更改为如下所示。
email_Tracking_export_2018_08_26.zip
email_Tracking_export_2018_08_27.zip
email_Tracking_export_2018_08_28.zip
email_Tracking_export_2018_08_29.zip
email_Tracking_export_2018_09_03.zip
email_Tracking_export_2017_11_01.zip
email_Tracking_export_2017_12_01.zip
email_Tracking_export_2018_01_01.zip
email_Tracking_export_2018_02_01.zip
email_Tracking_export_2018_03_01.zip
email_Tracking_export_2018_04_01.zip
条件:
- 如果文件名是 yyyy-mm-dd 格式,则保持原样
- 如果文件名是按字母顺序转换为 yyyy-mm-dd
- 如果那个特定年份的月份已经过去而不是原样离开,那么年份应该是前一年。
如何在 bash/Linux
中实现
以下是小部分的步骤,您可以找到答案并作为 bash 脚本执行,
- 做一个键值对映射,将月份映射到它的数值。 (多多关照lowercase/uppercase)
- 检查每个文件的格式。
- 为每个文件生成新名称。
- 然后,使用
mv
命令将文件重命名为新名称。
for f in email_Tracking_export_*.zip; do
case "$f" in
email_Tracking_export_????_??_??.zip) : ignore ;;
*) date=$(stat -c %Y "$f") # mod time in seconds
fmtdate=$(date --date="@$date" +%Y_%m_%d) # formatted
mv "$f" email_Tracking_export_$fmtdate.zip
;;
esac
done
我在 Linux 目录中有一些文件,如下所示。
email_Tracking_export_2018_08_26.zip
email_Tracking_export_2018_08_27.zip
email_Tracking_export_2018_08_28.zip
email_Tracking_export_2018_08_29.zip
email_Tracking_export_2018_09_03.zip
email_Tracking_export_history_Novemeber.zip
email_Tracking_export_history_December.zip
email_Tracking_export_history_january.zip
email_Tracking_export_history_february.zip
email_Tracking_export_history_march.zip
email_Tracking_export_history_April.zip
现在我想将文件名更改为如下所示。
email_Tracking_export_2018_08_26.zip
email_Tracking_export_2018_08_27.zip
email_Tracking_export_2018_08_28.zip
email_Tracking_export_2018_08_29.zip
email_Tracking_export_2018_09_03.zip
email_Tracking_export_2017_11_01.zip
email_Tracking_export_2017_12_01.zip
email_Tracking_export_2018_01_01.zip
email_Tracking_export_2018_02_01.zip
email_Tracking_export_2018_03_01.zip
email_Tracking_export_2018_04_01.zip
条件:
- 如果文件名是 yyyy-mm-dd 格式,则保持原样
- 如果文件名是按字母顺序转换为 yyyy-mm-dd
- 如果那个特定年份的月份已经过去而不是原样离开,那么年份应该是前一年。
如何在 bash/Linux
以下是小部分的步骤,您可以找到答案并作为 bash 脚本执行,
- 做一个键值对映射,将月份映射到它的数值。 (多多关照lowercase/uppercase)
- 检查每个文件的格式。
- 为每个文件生成新名称。
- 然后,使用
mv
命令将文件重命名为新名称。
for f in email_Tracking_export_*.zip; do
case "$f" in
email_Tracking_export_????_??_??.zip) : ignore ;;
*) date=$(stat -c %Y "$f") # mod time in seconds
fmtdate=$(date --date="@$date" +%Y_%m_%d) # formatted
mv "$f" email_Tracking_export_$fmtdate.zip
;;
esac
done