web-dev-qa-db-ja.com

検索コマンド:複数の条件

私のファイル/ディレクトリの命名の標準として、アンダースコアで区切られたファイル名に日付とタグ文字列を入れるようなものを使用します。例:

2015_03_10_usa_nyc_vacations_album_pictures

長い間、Recollのようなソフトウェアを使用してきましたが、通常、必要以上のレコードが記録されます。私の命名はかなり一貫しているので、findコマンドを使用してスクリプトのサイズを変更する方法があるはずだと思います。

単一の条件で検索を実行する方法は知っていますが、複数の基準/条件を検索する方法がわかりません。つまり、名前が特定の条件を満たすすべてのファイルを見つけるにはどうすればよいですか。次の例を考えてみましょう

  1. {2015} AND {{アルバム} OR {画像}}
  2. {アルバム} AND {休暇} AND {2015}
8
Pierre

通常、次のようなものを入力する価値はありません。

find /dir -regex '.*2015.*\(album.*\|picture.*\)'

時間を無駄にしないでください。タスクごとに1つのツールというgrepとUNIXの概念を使用してください。

find /dir|egrep '2015.*(album|picture)'

これは:

  • タイプを減らす-より速く結果を得る
  • より読みやすい(\なし、不要。*)
  • 高速になる可能性があります(パイプコマンドは、カーネルが2つのCPUの間でバランスを取ることができることを意味します。はい、通常のコンソールで今テストしました)
  • ファイルまたは他のソースからファイルリストを読みたい場合も同じです。
5
gena2x

最初の

 find DIR \( -name 2015\* -a \( -name \*album\* -o -name \*picture\* \) \) -delete

どこ

  • 拡張を避けるために*をエスケープする必要があります
  • サブシェルを回避するためにエスケープ(および)する必要があります
  • -deleteを好きなものに置き換えます

2つ目は宿題として残されます(ヒント\!

3
Archemar

最初のfind-regex 良いでしょう:

find /dir -regex '.*2015.*\(album.*\|picture.*\)'

2番目の場合:

find . -name "*album*" -a -name "*vacations*" -a -not -name "*2015*"
3
chaos