Shell脚本:检查目录是否为YYYY_MM_DD_HH此格式

时间:2015-07-14 13:09:27

标签: shell unix

我有一个脚本可以创建另一个路径中可用目录的文件列表。 现在,只有在此文件列表中的目录格式为“YYYY_MM_DD_HH”时,我才会执行某些任务。

我的文件列表包含以下条目:

2014_04_21_01

ASDF

2012_01_19_10

2010_01

现在我想将名称为YYYY_MM_DD_HH的目录移动到另一个路径。即,仅2014_04_21_01&必须移动2012_01_19_10。

请告知。

5 个答案:

答案 0 :(得分:1)

使用bash正则表达式模式匹配:

for dir in $list
do if [[ "$dir" =~ ^[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{2}$ ]]
   then mv "$dir" newdir/
   fi
done

答案 1 :(得分:1)

假设您的计算机上有GNU版本sed,您可以使用它轻松解析目录名称并执行命令。

假设我们有以下输入文件:

2014_04_21_01
asdf
2012_01_19_10
2010_01
2012_01_19_10_09
62012_01_19_10

您可以使用sed搜索正则表达式,并将其替换为mv命令,如下所示:

sed 's/^[0-9]\{4\}\(_[0-9]\{2\}\)\{3\}$/mv "&" "other_dir"/' file_list

将输出:

mv "2014_04_21_01" "other_dir"    # We want to run this
asdf
mv "2012_01_19_10" "other_dir"    # and this
2010_01
2012_01_19_10_09
62012_01_19_10

现在,如果您在sed替换的末尾添加(GNU esed选项(并在-n脚本之前添加sed选项,以确保仅执行成功替换),生成的命令将通过管道传输到您的shell中:

sed -n 's/^[0-9]\{4\}\(_[0-9]\{2\}\)\{3\}$/mv "&" "other_dir"/e' file_list
#   ^^                                                        ^

我建议先运行它而不使用e选项,以便检查mv命令是否格式正确。

答案 2 :(得分:1)

为什么要为文件列表创建单独的文件。只需进入该目录执行以下命令即可。我已将目标目录作为/ home / newdir /

ls | grep [0-9][0-9][0-9][0-9]_[01][0-9]_[0123][0-9]_[012][0-9] | awk '{print $0" /home/newdir/"}'  | xargs mv

在处理日期时要小心。如您所述,文件名格式为YYYY_MM_DD_HH,那么我们对MM,DD和HH有限制。如果我们谈论限制,那么我们就知道如何构建日历。所以9999_99_99_99是无效的文件名。它不满足YYYY_MM_DD_HH。 我们必须为限制构建脚本,或者我可以说整个日历。仍在努力。

答案 3 :(得分:1)

示例:

perl -nle 'system("mv $_ dir/year$1") if /^(\d{4})_\d\d_\d\d_\d\d/$' flist

将提取年份并将目录2014_04_21_01重命名为dir/year2014

答案 4 :(得分:1)

这个带有find选项的-regex命令应该处理这个问题:

cd /base/path/of/these/dirs

find . -type d -regextype posix-egrep -regex '.*/[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{2}$' \
      -exec mv '{}' /dest/dir/ \;