次のようなファイルでいっぱいのディレクトリがあります。
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 }'