我在MAC OS X机器上的X11窗口中工作。现在我在一个目录中有数百个文件,每个文件名包含一个子字符串,如“1970”,“1971”,......,“2014”等,表明该文件是该年份的。现在我刚刚创建了名为“1970”,“1971”,......,“2014”的子目录。
什么是将所有文件移动到与其年份对应的子目录中的单行UNIX命令?
答案 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
命令。