findコマンドで結果の前に./を付けないようにするにはどうすればよいですか?

findコマンドで結果の前に./を付けないようにするにはどうすればよいですか?

私はシェルスクリプトの初心者です。

以下のコマンドを実行すると、次のように出力されます。

$ 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

関連情報