このコマンドをどのように短縮できますか?目的は、ファイル名が一致する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
-a
find
のブール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