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

时间:2015-03-23 22:47:11

标签: unix subdirectory mv

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

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

1 个答案:

答案 0 :(得分:0)

如果年名子目录位于当前包含所有文件的单个目录中,那么您应该可以使用这样的内容,假设当前目录是该单个目录:

shopt -s nullglob
for year in {1970..2014}
do
    mv *?${year}* $year
    mv *${year}?* $year
done

为了防止尝试将1970移动到自身(这会失败),全局会坚持要移动名称中至少再移动一个字符而不仅仅是年份。您需要两个mv命令来阻止a-1970-b匹配两个glob表达式(这会导致第二个失败,因为文件已被删除)。像这样使用globbing可以正确保存文件名中的空格等。 (使用命令替换等,不会。)

shopt命令意味着如果给定的glob没有文件,输出中就没有任何内容。这将从mv(令人讨厌的)产生使用错误,但在其他情况下无害。如果你真的想要,你可以决定过滤这些错误信息;但是,您可能不希望将所有错误消息发送到/dev/null

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

你说你需要一个单行命令;用分号替换除do之后的换行符之外的每个换行符;使用空格替换do之后的换行符。

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