2

.私は多くの検索コマンドを実行してきましたが、bash が文字列として入力されたディレクトリを処理する方法について奇妙に思われることに気付きました。

find . -type f -exec sh -c 'cd $(dirname "$0") && aunpack "$0"' {} \;

~とはまったく異なる働きをする

find [current dir] -type f -exec sh -c 'cd $(dirname "$0") && aunpack "$0"' {} \;

何を与える?

bash は '.' を扱いますか および文字列でディレクトリ パスを別の方法で指定します。「。」ではありません 現在のディレクトリの代わり?

4

4 に答える 4

8

find引数として渡された場所に残りのパスを追加します。

つまり、「/home/user/find」ディレクトリにいる場合:

find .

版画:

.
./a
./b

しかし、試してみると:

find /home/user/find

それは印刷します:

/home/user/find
/home/user/find/a
/home/user/find/b

したがってfind、残りのパス (/a、/b...) を引数 (. または /home/user/find) に追加します。

于 2013-01-29T12:10:52.933 に答える
2

pwdの代わりに コマンドを使用することもでき.、同じように動作します。

find "`pwd`"  -type f -exec sh -c 'cd $(dirname "$0") && aunpack "$0"' {} \;
于 2013-01-29T12:04:21.790 に答える
2

@arutaku が問題の原因を突き止めました。別の可能な解決策を指摘させてください。のバージョンがfindサポートしている場合、-execdirプライマリは必要なことを非常に簡単に行います。各ファイルがあるディレクトリに cd し、ファイル名だけ (パスなし) でコマンドを実行します。

find . -type f -execdir aunpack {} \;
于 2013-01-29T18:29:27.460 に答える
1

Bashはそれとは何の関係もありません、それはのロジックですfind. 指定したパスを展開または正規化しようとはしません。パス.そのまま使用するだけです../../my/other/project

変換は現在の動作よりも複雑になるため、妥当だと思います。少なくとも、変換中にシンボリック リンクが解決されるかどうかを覚えておく必要があります。そして、何らかの理由で相対パスが必要なときはいつでも、それを再度相対化する必要があります。

于 2013-01-29T12:11:28.127 に答える