UNIX命令将多个文件移动到多个子目录?
我在MAC OS X机器上的X11窗口中工作。现在,我在一个目录中有数百个文件,每个文件名都包含一个子字符串,如“1970”、“1971”、“2014”等,表示该文件是当年的文件。现在我刚刚创建了名为“1970”、“1971”、“2014”的子目录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..
什么是一行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
选项的GNUmv
你说你需要一个单行命令;将do
后面的换行符替换为分号;将do
后面的换行符替换为空格
如果您知道年份从不在文件名的开头或结尾,可以使用单个
mv*?${year}?*$year
命令。Jonathan:非常感谢您的回答和详细解释。我会把这个留到将来,因为我经常需要类似的操作。