2つのパターンが与えられたら、特定のディレクトリを検索し、各パターンに一致する最後の3つのファイル名を印刷します。

2つのパターンが与えられたら、特定のディレクトリを検索し、各パターンに一致する最後の3つのファイル名を印刷します。

このコマンドをどのように短縮できますか?目的は、ファイル名が一致するABCフォルダに最新の3つのファイルを表示してから、ファイル名が一致してuvw同じ操作を実行することです。xyz

今後検索する文字列を追加する必要があるので、この長さを短くしたいと思います。

find . -name 'ABC' | xargs ls | grep -i uvw |sort| tail -n 3; find . -name 'ABC' | xargs ls | grep -i xyz |sort| tail -n 3

出力例:

2018-06-23T01-23-56.919Z-UVW.gz
2018-06-23T01-29-56.556Z-UVW.gz
2018-06-23T23-26-14.463Z-UVW.gz
2018-08-08T00-16-22.923Z-xyz.js
2018-08-08T00-16-24.517Z-xyz.js
2018-08-08T00-16-25.427Z-xyz.js

答え1

そしてzsh

set -o extendedglob # best in ~/.zshrc
for w (uvw xyz) printf '%s\n' **/ABC/(#i)*$w*(D[-3,-1]:t)
  • **/: すべてのレベルのサブディレクトリ
  • (#i):大文字と小文字を区別せずに次のように一致します。
  • (D[-3,-1]:t): グローバル予選
  • D: 隠しファイルを含め、find次の隠しディレクトリを表示します。
  • [-3,-1]:最後の3つだけを選択します(グローブはデフォルトで語彙順にソートされます)。
  • :t:修飾子抽出済みあなたと同じファイルパス(デフォルト名ls

ABC ディレクトリが複数ある場合、そのディレクトリの名前がソートに影響します。のファイルがa/ABCのファイルの前に表示されますb/ABC

答え2

これにより、一致するすべてのファイルが検索されます。どのこのスニペットは次のとおりです。

for fragment in ABC UVW xyz; do 
    find . -name "\*${fragment}\*" | sort | tail -n3; 
done

一致するファイルを探したい場合みんなその中でも、次のようにできます。

find . -name '*ABC*' -a -name '*xyz*' | sort | tail -n3

-afindのブールAND演算子はです。

BSDの場合と代わりにおよびをfind使用してください。-or-and-o-a

答え3

最も探している

find . -iregex '.*/ABC/[^/]*uvw.*' | sort | tail -n3

仕組みは次のとおりです。

  • -iregex大文字と小文字の区別モードの検索
  • .*/ABC/すべての深さでディレクトリABC(dirのフルネーム)を見つけます。
  • [^/]*uvw.*dir名の直後には文字列を含むファイル名がABC続き、その間にはサブディレクトリはありません。uvw

そしてsort部分的にtail影響を受けません。

別のパターンを追加するには、必要なすべての文字列でこのコマンドを繰り返す必要があります。あるいは、ファイルが3つだけ必要な場合は、ファイルがどのグループに属しているかに関係なく、すべてを1つのコマンドにまとめることができます。

find . -iregex '.*/ABC/[^/]*\(uvw\|xyz\)[^/]*' | sort | tail -n3

答え4

Bashスクリプトのforループを使って欲しいものを手に入れました。コマンドラインでこれを実行できますか?

#!/bin/bash
for i in ABC DEF
do
  for j in uvw xyz
  do
    x=`find . -iname $i | xargs ls | grep -i $j | sort | tail -n 3`
    echo "$x"
  done
done

関連情報