Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell脚本:检查目录是否为YYYY\u MM\u DD\u HH此格式_Shell_Unix - Fatal编程技术网

Shell脚本:检查目录是否为YYYY\u MM\u DD\u HH此格式

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

我有一个脚本,可以创建另一个路径中可用目录的文件列表。 现在,我只想在这个文件列表中的目录格式为“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 [[ "$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
替换的末尾添加(GNU
sed
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
替换的末尾添加(GNU
sed
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
将提取年份并将dir
2014\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

将提取年份并将dir
2014\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