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
UNIX命令将多个文件移动到多个子目录?_Unix_Subdirectory_Mv - Fatal编程技术网

UNIX命令将多个文件移动到多个子目录?

UNIX命令将多个文件移动到多个子目录?,unix,subdirectory,mv,Unix,Subdirectory,Mv,我在MAC OS X机器上的X11窗口中工作。现在,我在一个目录中有数百个文件,每个文件名都包含一个子字符串,如“1970”、“1971”、“2014”等,表示该文件是当年的文件。现在我刚刚创建了名为“1970”、“1971”、“2014”的子目录 什么是一行UNIX命令,可以将所有文件移动到与其年份对应的子目录中?如果年份名称子目录位于当前包含所有文件的单个目录中,则您应该能够使用类似的命令,假设当前目录是该单个目录: shopt -s nullglob for year in {1970..

我在MAC OS X机器上的X11窗口中工作。现在,我在一个目录中有数百个文件,每个文件名都包含一个子字符串,如“1970”、“1971”、“2014”等,表示该文件是当年的文件。现在我刚刚创建了名为“1970”、“1971”、“2014”的子目录


什么是一行UNIX命令,可以将所有文件移动到与其年份对应的子目录中?

如果年份名称子目录位于当前包含所有文件的单个目录中,则您应该能够使用类似的命令,假设当前目录是该单个目录:

shopt -s nullglob
for year in {1970..2014}
do
    mv *?${year}* $year
    mv *${year}?* $year
done
globbing坚持在名称中至少多移动一个字符,而不仅仅是在年份之前或之后,以防止试图将
1970
移动到自身中(这将失败)。您需要两个
mv
命令来防止
a-1970-b
匹配两个glob表达式(这将导致第二个失败,因为文件已经被删除)。像这样使用globbing可以正确地保留文件名中的空格等。(使用命令替换等不起作用。)

shopt
命令意味着如果给定的glob没有文件,那么输出中将没有任何内容。这将从
mv
生成一个使用错误(讨厌),但在其他方面是无害的。如果你真的想,你可以决定过滤这些错误消息;不过,您可能不想将所有错误消息发送到
/dev/null

由于您使用的是Mac电脑,因此没有带有非常有用的
-t target
选项的GNU
mv

你说你需要一个单行命令;将
do
后面的换行符替换为分号;将
do
后面的换行符替换为空格


如果您知道年份从不在文件名的开头或结尾,可以使用单个
mv*?${year}?*$year
命令。

Jonathan:非常感谢您的回答和详细解释。我会把这个留到将来,因为我经常需要类似的操作。