2017-11-08 7 views
2

私はこの声明に問題があります。なぜそれが機能していないのかわかりません。恐らく構文上の問題がありますが、どこには分からないのでしょうか。スクリプトは、@tmpという名前のディレクトリやドット付きのディレクトリを見つけ、一致するものを見つけたら削除しなければなりません。しかし、それは起こっていない。あなたが探しているFindステートメント+ -exec -rm -rが機能しない、構文の問題?/bash

find /home/user/data/ -type d \(-name "*@tmp" -o -regex "[0-9\.\/]+" \) -exec rm -r {} \; 
+1

'-exec'パーツを削除して、見つけたものを出力させるとどうなりますか?それは何を見つけるのですか? –

+0

これは何も表示されませんが、scrptの最初の部分であっても、このファイルは存在します。 – harcotlupus

+1

'* @ tmp'ではなく' * \ @ \ tmp' '? –

答えて

3

find . -type d \(-name '*@tmp*' -o -regex '.*/[0-9.]+' \) ... 

エスケープするためにそれらを必要と@tについての魔法のようなものは何もありませんし、あなたが主要な要素を一致させる必要があるので、正規表現は、全体のパスと一致します。

+1

'-delete'は修正の重要な要素ではなく、外部の' rm'インスタンスを実行する際のオーバーヘッドを避けるための最適化であることを強調する価値があります(裸の名前ではなく、名前の中のどこでも* @ tmp' *と一致するように '-name'パターンを修正すると、OPの散文リクエストとして、最後にのみではなく、コードが実装します)。 –

+1

私は通常、 'rm'の代わりに-deleteを使って、' rm'を使ってディレクトリを削除し、 'rmdir'を適用して空でないディレクトリを削除しようとしないようにします。この場合、OPはsledge hammer 'rm -r'を適用したいので、空でないディレクトリは削除されないので、' -delete'は必要な処理を実行できません。しかし....それは質問の不可欠な要素ではありません。 –

関連する問題