我有一个脚本可以创建另一个路径中可用目录的文件列表。 现在,只有在此文件列表中的目录格式为“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。
请告知。
答案 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 e
)sed
选项(并在-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/ \;