これは、このテキストファイル(ユーティリティの出力)をfslint
一連の規則に従って削除する重複ファイルのコマンドラインと、アーカイブするファイルのコメント行を含むbashスクリプトに変換することです。rm
ルールは基本的に次のとおりです。特定のディレクトリの重複ファイルのみを削除します。
目標は、複数のオペレーティングシステム(Mac OS X、Windows、Linux)で長年蓄積された約1TBの冗長性をクリーンアップすることです。すべてのデータがLinuxドライブにコピーされました。
#3 x 697,612,024 (1,395,236,864) bytes wasted
/path/to/backup-100425/file_a.dat
/another/path/to/backup-disk-name/171023/file_a.dat
/yet/another/path/to/labs data/some/path/file_a.dat
#4 x 97,874,344 (293,634,048) bytes wasted
/path/to/backup-100425/file b.mov
/another/path/to/backup-140102/file b.mov
/backup-120708/Library/some/path/file b.mov
/some/other/path/to/backup-current/file b.mov
#2 x 198,315,112 (198,316,032) bytes wasted
/path/to/backup-100425/file_c.out
/another/path/to/backup-disk-name/171023/file_c.out
最初の行は3つの同じコピーがあることを示し、file_a.dat
次の3行はそのパスをリストします。理想的には、ここから2つのコピーを削除する必要があります。私が言うのは、6桁(YYMMDD形式の日付)で構成されたディレクトリです。履歴バックアップディレクトリ。
ルール、適用この順に同じファイルの各セットは次のとおりです。
- ファイルがディレクトリを含むパスにある場合は、
Library
そのディレクトリを保持してください。 - ファイル
labs data
がまたはにある場合は、backup-current
ファイルを保持し、その中のすべての重複エントリを削除します。履歴バックアップディレクトリ。 - ファイルが履歴バックアップディレクトリにある場合は、ファイルを最新のバックアップディレクトリに保存し、古い重複エントリを削除します。
- それ以外の場合はファイルをアーカイブします。
希望の出力は次のとおりです。
#!/bin/bash
#3 x 697,612,024 (1,395,236,864) bytes wasted
rm '/path/to/backup-100425/file_a.dat'
rm '/another/path/to/backup-disk-name/171023/file_a.dat'
#/yet/another/path/to/labs data/some/path/file_a.dat
#4 x 97,874,344 (293,634,048) bytes wasted
rm '/path/to/backup-100425/file b.mov'
rm '/another/path/to/backup-140102/file b.mov'
#/backup-120708/Library/some/path/file b.mov
#/some/other/path/to/backup-current/file b.mov
#2 x 198,315,112 (198,316,032) bytes wasted
rm '/path/to/backup-100425/file_c.out'
#/another/path/to/backup-disk-name/171023/file_c.out
私はシェルツールawk、grep、sedに慣れていません。このスレッド私は私の最初の草案が概念的に間違っていたことに気づきました。 「それは[私が] Cのような命令型言語でやるべきことを素直に翻訳したものでした。」
実際、ここで扱っている内容は次のとおりです。文書しかし、一緒にファイルの内容。
この状況に適したシェルスクリプトを使用していますか?
それでは、効率的なスクリプトはどのようなものでしょうか?
編集する:@Edの答えとコードを読んだ後、仕事と要件を明確にしようとしました。これは問題を完全に解決しました。
ベストアンサー1
私がどれくらいの時間を費やすかを考えると、あなたの要件のリストを理解することはできません。ただし、以下はあなたが興味を持っているように見えるファイル形式をソートして印刷するためのスクリプトです。残りはあなたが理解できることを願っています。
$ cat tst.awk
/^#/ { prt(); print; next }
{ files[$0] }
END { prt() }
function prt( file, isLibrary, isLabsBack, isNothing) {
for (file in files) {
if ( file ~ /(^|\/)Library(\/|$)/ ) {
isLibrary[file]
}
else if ( file ~ /(^|\/)(labs data|backup-current)(\/|$)/ ) {
isLabsBack[file]
}
else {
isNothing[file]
}
}
for (file in isLibrary) {
print "Library", file
}
for (file in isLabsBack) {
print "LabsBack", file
}
for (file in isNothing) {
print "Nothing", file
}
delete files
}
。
$ awk -f tst.awk file
#3 x 697,612,024 (1,395,236,864) bytes wasted
LabsBack /yet/another/path/to/labs data/some/path/file_a.dat
Nothing /another/path/to/backup-disk-name/171023/file_a.dat
Nothing /path/to/backup-100425/file_a.dat
#4 x 97,874,344 (293,634,048) bytes wasted
Library /backup-120708/Library/some/path/file b.mov
LabsBack /some/other/path/to/backup-current/file b.mov
Nothing /path/to/backup-100425/file b.mov
Nothing /another/path/to/backup-140102/file b.mov
#2 x 198,315,112 (198,316,032) bytes wasted
Nothing /path/to/backup-100425/file_c.out
Nothing /another/path/to/backup-disk-name/171023/file_c.out