現在2つのスクリプトを使用しています。年ごとにファイルをフィルタリングするスクリプト1つ。 2番目のスクリプトは年サブフォルダにあり、月(01-12)ごとにフィルタリングされます。
以下のものより良いものがありますか?
すべてのファイルは次の1つのディレクトリにあります。
ソース: ./tape_backup/sync1/* (140万ファイル) ターゲット: ./tape_backup/<1990 - 2019>/<01-12>/ (年/月ごとに構成)
ファイル名構文:A1000_T195_R256393_D120498094600
_D = 重要ではない
D = 開始日
1-2 = 月
3-4 =日(重要ではない)
5-6 = 3
7-* =タイムスタンプ(重要ではない)
だから私が全部やるんだ98
次のように読みます。
for f in ./sync1 do
(月と年を確認してから月と年のフォルダに移動/)
完了
Cygwinとサーバー2012 r2を使用しています。
#C:/cygwin/bin/bash
for filename in ./* ; do
if [[ $filename == *D??90 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/1990/
elif [[ $filename == *D??91 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/1991/
elif [[ $filename == *D??92 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/1992/
elif [[ $filename == *D??93 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/1993/
elif [[ $filename == *D??94 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/1994/
elif [[ $filename == *D??95 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/1995/
elif [[ $filename == *D??96 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/1996/
elif [[ $filename == *D??97 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/1997/
elif [[ $filename == *D??98 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/1998/
elif [[ $filename == *D??99 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/1999/
elif [[ $filename == *D??00 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2000/
elif [[ $filename == *D??01 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2001/
elif [[ $filename == *D??02 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2002/
elif [[ $filename == *D??03 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2003/
elif [[ $filename == *D??04 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2004/
elif [[ $filename == *D??05 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2005/
elif [[ $filename == *D??06 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2006/
elif [[ $filename == *D??07 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2007/
elif [[ $filename == *D??08 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2008/
elif [[ $filename == *D??09 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2009/
elif [[ $filename == *D??10 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2010/
elif [[ $filename == *D??11 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2011/
elif [[ $filename == *D??12 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2012/
elif [[ $filename == *D??13 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2013/
elif [[ $filename == *D??14 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2014/
elif [[ $filename == *D??15 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2015/
elif [[ $filename == *D??16 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2016/
elif [[ $filename == *D??17 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2017/
elif [[ $filename == *D??18 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2018/
elif [[ $filename == *D??19 ]] ; then
mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2019/
fi
done
答え1
異なるドライブ間でコンテンツを移動するために140万回の呼び出しを実行すると、速度がmv
遅くなります。mv
通話を減らしてください。
??
パターンのパターンが強度と一致する必要があるとします。
for year in {1990..2019}; do
find . -maxdepth 1 -type f -name "*D$year" \
-exec mv -t "/cygdrive/d/RAID5/RAID200/invoices/1/$year/" {} +
done
これは関連するすべての年を繰り返します。毎年find
、特定のパターンに一致するファイルをできるだけ一度に一括移動するコマンドを実行します。
このコードは、GNU mv
(該当する-t
オプションについて)とGNU find
(またはfind
そのオプションがあるすべて-maxdepth
)を使用していると想定していますbash
。ソースディレクトリにサブディレクトリがない場合は、-maxdepth 1
コマンドから削除できます。
答え2
140万回電話をかけるとmv
速度が遅くなります。これを避ける方法はありません。しかし、ファイル名のパターンをすでに知っているので、バッチ処理して複数のファイルを呼び出すのはどうですかmv
?
for yy in {1990..2019}
do
y=${yy#[0-9][0-9]} # remove first two digits of year
mv ./*D??"$y" "/cygdrive/d/RAID5/RAID200/invoices/1/$yy"
done
または、「引数の長さを超えました」エラーが発生した場合は、以下を使用してくださいxargs
。
for yy in {1990..2019}
do
y=${yy#[0-9][0-9]}
printf "%s\0" ./*D??"$y" | # NUL-delimited filenames for xargs -0
xargs -0 -r mv -t "/cygdrive/d/RAID5/RAID200/invoices/1/$yy"
done
答え3
誰もが知っているように、私はこのオプションを使用しました。寄稿者: muru。実際に上記の投稿の両方のオプションを試しました。
少しだけ修正すると、元の50行のコードで毎秒約3個のファイルを処理しています。今は毎秒30~50回程度しています。
for yy in {1998..2018} do y=${yy#[0-9][0-9]} # 年の最初の 2 桁を削除 mv -v ./sync1/_D???$y"/cygdrive/d/RAID5/RAID200/tape_backup/$yy"#mv -v ./sync1/_D???'$y'"/cygdrive/d/RAID5/RAID200/tape_backup/$yy" 完了
:)