ファイルディレクトリをサブディレクトリに分割する方法

ファイルディレクトリをサブディレクトリに分割する方法

次のようなファイルでいっぱいのディレクトリがあります。

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

サブディレクトリを作成し、そのサブディレクトリにファイルを移動するために使用できるクイックワンラインコマンドはありますか?

このディレクトリには33,000を超えるファイルがあることに言及したいと思います。

答え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 }'
    

関連情報