私はシェルスクリプトの初心者です。
以下のコマンドを実行すると、次のように出力されます。
$ cd demo
$ ls
dir1 dir2 dir3 dir4 dir5
$
$find . -mtime -2 -type f -regextype posix-egrep -regex ".*/(dir1|dir2|dir3|dir4|dir5)/.+" -exec ls {} \; > /tmp/basefileslist
./dir1/demo1.sh
./dir2/demo2.sh
./dir3/demo3.sh
./dir4/demo4.sh
./dir5/demo5.sh
いいえを受け取るべきですか./
?以下のような出力が必要です。
dir1/demo1.sh
dir2/demo2.sh
dir3/demo3.sh
dir4/demo4.sh
dir5/demo5.sh
答え1
in findの出力はオプションの前の引数./
から来ます。パラメータを.
変更すると、.
焦点を合わせた出力部分が変わります。あなたの例を考えると、要求された出力が生成されます。
find dir1 dir2 dir3 dir4 dir5 -mtime -2 -type f -exec ls {} \;
正規表現オプションは、サブディレクトリパラメータを指定する操作と重複すると推測されるため、除外しました。出力は次のとおりです
dir1/demo1.sh
dir2/demo2.sh
dir3/demo3.sh
dir4/demo4.sh
dir5/demo5.sh
特定のテストケース(一致する5つのサブディレクトリのみ)では、サブディレクトリのリストを単純なシェルglobに減らすことができます。
find dir[1-5] -mtime -2 -type f -exec ls {} \;
またはより短い球:
find dir? -mtime -2 -type f -exec ls {} \;
多くのユースケースでは、これらの必須ファイルは使用またはfind dir1 dir2 dir3 dir4 dir5
検出されません。find dir?
しかし、私の答えの目的は、オプションの前のパラメータが検索出力のパスにどのように影響するかを示すことです。
答え2
find
出力からプレフィックスを削除する代わりに、GNU固有(ただしGNU固有)述語を使用するようにコマンドを変更できます。以下は、目的の出力を提供するコマンドの例です。./
-regextype
-printf
-exec
find . -mtime -2 \
-type f \
-regextype posix-egrep \
-regex '.*/(dir1|dir2|dir3|dir4|dir5)/.+' \
-printf '%P\n' > /tmp/basefileslist
このコマンドでは、述語は前のプレフィックスなしで-printf '%P\n'
見つかった各ファイルの相対パスを印刷するために使用されます。書式指定子は、相対パス(開始するように指定したディレクトリに相対)を指定し、各パスを新しい行に印刷する必要があることを指定します。find
./
%P
.
\n
このコマンドを実行した後、出力は次のようになります。
dir1/demo1.sh
dir2/demo2.sh
dir3/demo3.sh
dir4/demo4.sh
dir5/demo5.sh