特別な場合はファイルを削除し、可能であれば再帰的に削除します

特別な場合はファイルを削除し、可能であれば再帰的に削除します

私はかなり複雑な条件付き削除操作を実行できる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.bakfile2.mpgfile3.cutfile3.cut.bakfile3.recfile3.mpg

おすすめ記事