Shell脚本:检查目录是否为YYYY\u MM\u DD\u HH此格式
我有一个脚本,可以创建另一个路径中可用目录的文件列表。 现在,我只想在这个文件列表中的目录格式为“YYYY\u MM\u DD\u HH”时执行一些任务 我的文件列表包含以下条目: 2014年4月21日01 asdf 2012年1月19日10日 2010_01 现在,我想将名称为YYYY_MM_DD_HH的目录移动到另一个路径。即,只有2014年4月21日和2012年1月19日10日必须移动Shell脚本:检查目录是否为YYYY\u MM\u DD\u HH此格式,shell,unix,Shell,Unix,我有一个脚本,可以创建另一个路径中可用目录的文件列表。 现在,我只想在这个文件列表中的目录格式为“YYYY\u MM\u DD\u HH”时执行一些任务 我的文件列表包含以下条目: 2014年4月21日01 asdf 2012年1月19日10日 2010_01 现在,我想将名称为YYYY_MM_DD_HH的目录移动到另一个路径。即,只有2014年4月21日和2012年1月19日10日必须移动 请告知。使用bash regex模式匹配: for dir in $list do if [[ "$di
请告知。使用bash regex模式匹配:
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
使用bash regex模式匹配:
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
假设您的计算机上有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
替换的末尾添加(GNUsed
)e
选项(在sed
脚本之前添加-n
选项以确保只执行成功的替换),生成的命令将通过管道传输到shell中:
sed -n 's/^[0-9]\{4\}\(_[0-9]\{2\}\)\{3\}$/mv "&" "other_dir"/e' file_list
# ^^ ^
我建议先运行它,不要使用
e
选项,以检查mv
命令的格式是否正确。假设您的计算机上有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
替换的末尾添加(GNUsed
)e
选项(在sed
脚本之前添加-n
选项以确保只执行成功的替换),生成的命令将通过管道传输到shell中:
sed -n 's/^[0-9]\{4\}\(_[0-9]\{2\}\)\{3\}$/mv "&" "other_dir"/e' file_list
# ^^ ^
我建议先运行它,不要使用
e
选项,以检查mv
命令的格式是否正确。为什么要为文件列表创建单独的文件。只需进入该目录,执行以下命令。我已将目标目录设置为/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\u MM\u DD\u HH,那么我们对MM、DD和HH有限制。如果我们谈论限制,那么我们就知道日历是如何构造的。因此9999_99_99_99是无效的文件名。它不符合YYYY\U MM\U DD\U HH。
我们必须建立脚本的限制,或者我可以说整个日历。仍在进行中。为什么要为文件列表创建单独的文件。只需进入该目录,执行以下命令。我已将目标目录设置为/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\u MM\u DD\u HH,那么我们对MM、DD和HH有限制。如果我们谈论限制,那么我们就知道日历是如何构造的。因此9999_99_99_99是无效的文件名。它不符合YYYY\U MM\U DD\U HH。
我们必须建立脚本的限制,或者我可以说整个日历。仍在进行中。示例:
perl -nle 'system("mv $_ dir/year$1") if /^(\d{4})_\d\d_\d\d_\d\d/$' flist
将提取年份并将dir2014\u 04\u 21\u 01重命名为dir/year2014
示例:
perl -nle 'system("mv $_ dir/year$1") if /^(\d{4})_\d\d_\d\d_\d\d/$' flist
将提取年份并将dir2014\u 04\u 21\u 01重命名为dir/year2014
此带有-regex
选项的单个find
命令应注意以下事项:
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/ \;
带有-regex
选项的单个find
命令应处理以下问题:
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/ \;
除了Perl解决方案,我尝试过的所有其他解决方案都产生了预期的结果。谢谢大家!除了Perl解决方案,我尝试过的所有其他解决方案都产生了预期的结果。谢谢大家!这将捕获文件和目录。但是,如果要这样做,为什么不:mv[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]targetdir
这将捕获文件和目录。但是如果你要这样做,为什么不:mv[0-9][0-9][0-9][0-9]u[0-9][0-9][0-9][0-9][0-9][0-9][0-9]targetdir