私はかなり複雑な条件付き削除操作を実行できるUnixコマンドシーケンスを探しています。
ファイルに「[NAME].rec」または「[NAME].mpg」という名前の対応するファイルがない場合、拡張子が「[NAME].cut」および「[NAME].cut.bak」のファイルはすべて削除されます。同じフォルダ。
このコマンドは、最小限のカーネルを持つ統合デバイスで実行する必要があるため、「特殊ツール」は使用されません。たとえば、「ls」と「rm」を使用できますが、「find」は存在しません(つまり、依存したくない外部ツールを介してのみ可能です)。
可能であれば、このコマンドはサブディレクトリからも繰り返し削除する必要があります。
背景は次のとおりです。私は録画されたショーを切り取ることができるLinuxベースのPVR用のツールを開発しています。各録画(拡張子.recまたは.mpg)に対して、クリップマーカーが.cutファイルに保存されます。一部の録音が移動/名前変更/削除されると、その切り捨てられたファイルはディスクから無駄になります。役に立たないカットファイルを削除するためにCで実装しました。さて、(簡単な)システムベースのソリューションがあるかどうか疑問に思います。この場合、「システム」を介してバックグラウンドで実行できるため、アプリの反応性が向上します。
以下は、PVRファームウェアに含まれるコマンドです。
嗜好、fgrep、flash_erase、flash_eraseall、flash_info、無料、getty、grep、ヘッダー、hexdump、ホスト名、id、ifconfig、インストール、kill、killall、ln、ロガー、ログイン、ls、md5sum、mkcramfs、mkdir、mknod、mktもっと見る、インストール並べ替え
私に与えるアドバイスがありますか?
ベストアンサー1
もっと簡単にすることはできませんが、うまくいきます。名前に改行文字を含むファイルがターゲットディレクトリに存在しないとします。;まず、次のコマンドを使用してコマンドをテストします。
find . -type f \( -name "*.cut" -o -name "*.cut.bak" \) -exec bash -c '[ -f "$(<<< "{}" sed "s/\(.*\/[^.]*\).*/\1/").rec" -o -f "$(<<< "{}" sed "s/\(.*\/[^.]*\).*/\1/").mpg" ] && echo "{}"' \;
リストされているファイルが削除される予定のファイルの場合は、次のコマンドを実行して続行できます。
find . -type f \( -name "*.cut" -o -name "*.cut.bak" \) -exec bash -c '[ -f "$(<<< "{}" sed "s/\(.*\/[^.]*\).*/\1/").rec" -o -f "$(<<< "{}" sed "s/\(.*\/[^.]*\).*/\1/").mpg" ] && rm "{}"' \;
一時的に作成されたディレクトリ階層をテストします。
~/tmp$ tree
.
└── dir1
├── file1.cut
├── file1.cut.bak
├── file1.rec
├── file2.cut
├── file2.cut.bak
├── file2.mpg
├── file3.cut
├── file3.cut.bak
└── subdir1
├── file1.cut
├── file1.cut.bak
├── file1.rec
├── file2.cut
├── file2.cut.bak
├── file2.mpg
├── file3.cut
└── file3.cut.bak
2 directories, 16 files
~/tmp$ find . -type f \( -name "*.cut" -o -name "*.cut.bak" \) -exec bash -c 'if [ -f "$(<<< "{}" sed "s/\(.*\/[^.]*\).*/\1/").rec" -o -f "$(<<< "{}" sed "s/\(.*\/[^.]*\).*/\1/").mpg" ]; then rm "{}"; fi' \;
~/tmp$ tree
.
└── dir1
├── file1.rec
├── file2.mpg
├── file3.cut
├── file3.cut.bak
└── subdir1
├── file1.rec
├── file2.mpg
├── file3.cut
└── file3.cut.bak
2 directories, 8 files
ご覧のように、拡張子を持つすべてのファイル.cut
または.bak
名前と拡張子が同じファイルまたは.rec
既存の.mpg
ファイルが繰り返し削除されます(file1.cut
したがってfile1.cut.bak
削除され、file1.rec
削除file2.cut
され、同じディレクトリにファイルが存在しないため削除されない)。file2.cut.bak
file2.mpg
file3.cut
file3.cut.bak
file3.rec
file3.mpg