〜で終わる一時ファイルを削除するコマンド


15

何日も前に、この便利なbashエイリアス(〜/ .bash_aliasesのコンテンツ)を見つけました

# aliases

# finds temporary files ending with '~' and deletes them
alias rm~='find . -name '*~' -print0 | xargs -0 /bin/rm -f'

今、私はで終わる3つのファイルを含むいくつかのディレクトリのrm~後に使用しようとしcdました~

ターミナルでこのエラーが発生し、ファイルが削除されませんでした

find: paths must precede expression: 1n.in~
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

また、から試してみたrm~ところ/home/me、何もしていないようです。または、時間がかかる場合があります。

エラーが発生する理由と修正方法を教えてください。

ありがとう!

回答:


26

bashエイリアスは適切に記述されていません(単一引用符はあまり使用されていません)。代わりに:

alias rm~='find . -name "*~" -print0 | xargs -0 /bin/rm -f'

今、私は個人的にパイプとの無駄な使用が好きではないxargsので、あなたのエイリアスは次のように書く方が良いでしょう:

alias rm~='find . -name "*~" -type f -exec /bin/rm -fv -- {} +'

-type fオプションファイルのみ(いないなど、ディレクトリ、リンク、)、発見するように-vするオプションrmの冗長(何それの削除プリントアウト)されるようにします。+最後になるようにfind動作しrm、すべての見つかったファイルと(の唯一のインスタンススポーンrm、代わりのファイルごとに1つ)。

今からman bash

ほとんどすべての目的で、エイリアスはシェル関数によって置き換えられます。

エイリアスの代わりに、関数を使用することをお勧めします:.bash_aliasesファイル内でエイリアスをコメントし(つまり、#その行の前に置きます)、file .bashrcにこの関数を置きます(ファイル内のどこでも、最後に問題ありません) :

rm~() {
    find . -name "*~" -type f -exec /bin/rm -fv -- {} +
}

また、他の答えが言及しているように、-deleteコマンドを使用して見つけることができます。この場合、rm~関数は次のようになります。

rm~() {
    find . -name "*~" -type f -printf "Removing file %p\n" -delete
}

実際、たとえば--dry-run、引数を取り、削除するものだけを出力するクールな関数を作成できます。

rm~() {
    case "$1" in
    "--dry-run")
        find . -name "*~" -type f -printf "[dry-run] Removing file %p\n"
        ;;
    "")
        find . -name "*~" -type f -printf "Removing file %p\n" -delete
        ;;
    *)
        echo "Unsupported option \`$1'. Did you mean --dry-run?"
        ;;
    esac
}

次に使用:

rm~ --dry-run

削除されるファイルのみを表示する(ただし、削除はしない)

rm~

これに満足しているとき。

ニーズに合わせて拡張しましょう!

注意。変更を有効にするには、新しいターミナルを開く必要があります。


ありがとう!それはうまく動作し、予行演習は非常に便利です。
ビナヤックGarg

2
find -type f -name '*~' -delete(ほかに選択の武器、git clean -dfx .
sehe

2
これはとてもエレガントなソリューションで、小道具を渡すためだけにログインする必要がありました。よろしくお願いします!
CodeChimp

9

*~エイリアスに割り当てられる前にシェルによって展開されます。実際の割り当ては次のとおりです。

alias rm~='find .name some~ file~ 1n.in~ -print0 | xargs -0 /bin/rm -f'

エイリアスの代わりに関数を使用することをお勧めします。これらの関数は、引用に関してはるかに強力で扱いやすいです。

その間、余分なものを削除し.(パラメーターが指定されていない場合は現在のディレクトリが暗黙的に指定されます)xargs-deleteオプションが既に存在するため、悪用を停止します。

rm~() { find -name '*~' -ls -delete; }

この-lsオプションはオプションですが、追加すると、削除されたファイルが表示されます。


+1ありがとう!しかし、この関数はどこに追加しますか?
ビナヤックGarg

@VinayakGargあなたもあなたにそれを追加することができます.bash_aliasesが、私は通常それらを私のにまっすぐに入れます.bashrc
レーケンシュタイン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.