別の名前に基づいてファイルを見つけ、1行にすべて削除する方法[複製]

別の名前に基づいてファイルを見つけ、1行にすべて削除する方法[複製]

私は別の名前に基づいてファイルを見つける方法を知っています。問題は、すべてのファイルを一度に削除する方法がわからないことです。 z/OS390 で OMVS を使用しています。

別の拡張子で検索されたファイルを見つけるために、次のことが成功しました。

find . -name "*.xml" -o -name "*.ipm" -type f

1つの名前でのみ検索した後にファイルを削除するには、次の操作が正常に行われました。

find . -name "*.xml" -type f -exec rm -iv {} \;

さて、これら2つのアイデアを混ぜると、姓で見つけたファイルだけを削除します。

find . -name "*.xml" -o -name "*.ipm" -type f -exec rm -iv {} \;

この場合、最初のパターン()に一致するファイルは*.xmlの影響を受けているようです-exec rm

検索してみると、問題は、私が見つけたすべての名前を「維持」する必要があるということです。今後実行rm。 3つの方法を試しましたが、成功しませんでした。

最初の試み:

$ find . -name "*.xml" - o -name "*.ipm" -type f -print0 | xargs -0
FSUM6372 Unknown option "-"
Usage: find directory ... expression
xargs: FSUM6001 Unknown option "-0"

Usage: xargs Ý-l#¨Ý-L #¨ Ý-irepl¨Ý-I repl¨ Ý-n#¨ Ý-tpx¨ Ý-s#¨ Ý-eeof¨Ý-E eof¨ Ýc
md Ýargs ...¨¨

2回目の試み:

$ find . (-name "*.xml" - o -name "*.ipm") -type f
FSUM7332 syntax error: got (, expecting Newline

3回目の試み:

$ find . -type f \(-name "*.xml" -o -name "*.ipm"\)
FSUM6372 Unknown option "(-name"
Usage: find directory ... expression

答え1

角括弧の試行では、周囲に空白がないfindというオプションが表示されますが、(-nameどうすればよいかわかりません。代わりに、角かっこの周りにスペースを追加してください。たとえば、次のようになります。

find . \( -name "*.xml" -o -name "*.ipm" \) -type f -exec rm -iv {} \;

または、GNUがある場合は、次のものをfind使用できます。-delete-exec rm -iv {} \;

+ワイルドカードが示すように、引数リストを受け取るコマンドを実行しているため、使用して一部のプロセスを-exec保存するのではなく(一致する頻度によって多くのプロセスを終了できます)、一部のプロセスを終了できます\;。パスをコレクションとして収集し、+各パスに対して1つのアプリケーション呼び出しではなく1つのアプリケーション呼び出し(ここ)を使用して適用します。したがって、より効率的なソリューションがない場合や使用したくない場合は、次の手順を実行します。-execrm-delete

find . \( -name "*.xml" -o -name "*.ipm" \) -type f -exec rm -iv {} +

答え2

括弧を使用すると効果がありますが、シェルがそれをサブシェル呼び出しとして解釈しないようにエスケープする必要があります。バックスラッシュ、\(および\)または引用符を使用できます。

ファイル名に改行やその他の制御文字が含まれていない場合(誰かが悪意のある意図を持っていない場合)、最も速く、-print0と-を必要としないxargsメソッドのパイプを使用できます。 0個のオプション

関連情報