![如何将文件目录拆分为子目录](https://linux22.com/image/72669/%E5%A6%82%E4%BD%95%E5%B0%86%E6%96%87%E4%BB%B6%E7%9B%AE%E5%BD%95%E6%8B%86%E5%88%86%E4%B8%BA%E5%AD%90%E7%9B%AE%E5%BD%95.png)
我有一个充满类似以下文件的目录:
3260_661901_2008-2008.dat
3260_661901_2009-2009.dat
3260_661901_2010-2010.dat
3260_661901_2011-2011.dat
3260_661901_por-1998.dat
3260_662336_1999-1999.dat
3260_662336_2000-2000.dat
3260_662336_2001-2001.dat
3260_662336_2002-2002.dat
我想将文件拆分为文件名中第 6 个和第 7 个字符之后的目录名称,如下所示:
66/3260_661901_2008-2008.dat
66/3260_661901_2009-2009.dat
66/3260_661901_2010-2010.dat
66/3260_661901_2011-2011.dat
67/3260_671901_por-1998.dat
67/3260_672336_1999-1999.dat
67/3260_672336_2000-2000.dat
88/3260_882336_2001-2001.dat
88/3260_882336_2002-2002.dat
是否有一个快速的单行命令可以用来创建子目录并将文件移入其中?
我应该提到该目录中有超过 33k 个文件。
答案1
假设你正在使用bash
你可以运行
for f in *.dat; do mkdir -p "${f:5:2}"; mv "$f" "${f:5:2}/"; done
或者(如果文件太多而无法for f in *.dat
工作)
while read f; do mkdir -p "${f:5:2}"; mv "$f" "${f:5:2}/"; done < ls
答案2
尝试
ls | awk '{d=substr($0,6,2) ; printf "mkdir %s ; mv %s %s\n",d,$1,d }' | bash
- 在这种情况下,您可以使用 ls 结果作为输入。
你会收到错误消息,因为 dir 在 first 之后就存在
mkdir
,要摆脱使用:awk '{d=substr($0,6,2) ; printf "test -d %s || mkdir %s ; mv %s %s\n",d,d,$1,d }'