両方のインスタンスを破壊せずに-execから確実に呼び出す意味スキームを見つけることはできますか?

両方のインスタンスを破壊せずに-execから確実に呼び出す意味スキームを見つけることはできますか?

次のようなhttp://superuser.com/questions/1780479そしてhttp://superuser.com/questions/1777606、$ 1、および$ 2ディレクトリで同じフルパスシンボリックリンクの時間を比較するために、次のスクリプトを実行します。

#!/bin/bash
cd $1
find . -type l -exec bash -c "if [[ -h \"{}\" && -h \"$2/{}\" ]]; then if (test $(readlink \"{}\") = $(readlink \"$2/{}\")) then if (find \"$2/{}\" -prune -newer \"{}\" -printf 'a\n' | grep -q a) then echo \"{} is older than $2/{}\"; else if (find \"{}\" -prune -newer \"$2/{}\" -printf 'a\n' | grep -q a) then echo \"$2/{} is older than {}\"; fi; fi; fi; fi" \;

使い方はCompare_times.shディレクトリ_1ディレクトリ_2compare_times.shスクリプト名はどこにありますか?)次の例のように使用します。

user@machine:/tmp/D1$ ls -lt --full-time /tmp/linked_file /tmp/D*
-rw-r--r-- 1 user user  0 2023-04-25 00:12:09.289942358 +0200 /tmp/linked_file

/tmp/D2:
total 0
lrwxrwxrwx 1 user user 14 2023-04-25 00:07:00.265830604 +0200 lnk -> ../linked_file

/tmp/D1:
total 0
lrwxrwxrwx 1 user user 14 2023-04-25 00:06:40.922078186 +0200 lnk -> ../linked_file
user@machine:/tmp/D1$ compare_times.sh . ../D2
./lnk is older than ../D2/./lnk
user@machine:/tmp/D1$

ご覧のとおり、find電話bash自体が電話しますfind。 (おそらくこのように書くのがよりエレガントであるようですが、今はそれが要点ではありません。findfind

コマンドのマニュアルページには再入find可能かどうかは記載されていません。再入力がfindない場合はfind、いくつかの出力、つまり両方のディレクトリで同じ名前と同じ場所を持ち、同じファイル名を指しますが、タイムスタンプが異なるいくつかのシンボリックリンクが自動的に欠落している可能性があるとします。

ベストアンサー1

すべてのコマンドを再入力できるわけではありません。

あなたは何について考える?

通常、再入は、いくつかのグローバル状態を暗黙的に使用し、関数を同時に2回呼び出すライブラリ関数に問題を引き起こします(たとえば、それ自体内で関数を呼び出すと、その状態は混乱します)。 (例えばmalloc() と printf() が再入できないのはなぜですか?それはすべてです。 )

しかし、プロセス間にはグローバルな状態がなく、すべて独自のメモリ空間とオペレーティングシステムがあり、ハードウェアはプロセスが他のプロセスのメモリを妨げないようにします。もちろん、たとえばファイルシステムはグローバルな状態ですが、状態を保存するfindためにそれを使用する必要があるかどうかはわかりません。とにかく、一時ファイルを必要とする尊敬できるプログラムは、通常、独自の一時ファイルを使用するのに非常に熟練しています。

ファイルシステムの状態が問題の場合、find互いの子プロセスを呼び出すプロセスに固有のものであることを確認するのは困難ですが、同時プロセスの実行をfind開始した可能性があります。


あるファイルから別のファイルを実行することがどれほど役に立つかは別の質問です。しかし、これを行うと、...というディレクトリの下にあるすべての一般的なファイルがfind見つかるようです。x

$ mkdir -p {a/x,b,x}; touch {a/x,b,x}/foo.txt
$ find . -type d -name x -exec find {} -type f \;;
./a/x/foo.txt
./x/foo.txt

おすすめ記事