Macでgnuツールを使用
何が起こっているのかわかりませんが、findの出力をxargsにパイプすることには、異なる場所のディレクトリ構造に表示される同じ名前のファイルに触れる際に問題があるようです。
私のディレクトリ:
dir
-- dirone
---- myfile.txt
---- otherfile.txt
-- dirtwo
---- myfile.txt
このコマンドを実行すると、アクセス許可が拒否されたというエラーが表示されます。
find dir -name "myfile.txt" | xargs -0 -I FILE sh -c "ls FILE"
ファイルをタッチ/ lsすることすらできません。ある「otherfile.txt」にアクセスしても問題ありません
find dir -name "otherfile.txt" | xargs -0 -I FILE sh -c "ls FILE"
何らかの競合状態などはありますか?最終的にはでファイルを変更したいのですが、ファイルを変更することsed -i
すらできません。完全なファイルパスがxargsに渡されているため、理解できません。完全なパスが必要で、同じ名前が問題にならないという事実がありますか?
編集:OKはまだ私がパーマエラーを受け取っていた理由を理解していませんが、これはうまくいくようです:
find dir -name "otherfile.txt" -type file -print0 | xargs -0 -I FILE sh -c "ls FILE"
削除するだけ-0
でもうまくいきましたが、どちらの方法が良い/安全かわかりませんか?
ディレクトリ設定を考えると:
$ find dir
dir
dir/dirtwo
dir/dirtwo/myfile.txt
dir/dirone
dir/dirone/myfile.txt
dir/dirone/otherfile.txt
私があなたの(元の)コマンドを使用する場合、私はあなたの元の問題を再現することができます:
$ find dir -name "myfile.txt" | xargs -0 -I FILE sh -c "ls FILE"
dir/dirtwo/myfile.txt
sh: line 1: dir/dirone/myfile.txt: Permission denied
$
何が起こっているのかをよりよく理解するために、そのコマンドのバリエーションを試してみましょう。
$ find dir -name "myfile.txt" | xargs -0 -I FILE echo -FILE-
-dir/dirtwo/myfile.txt
dir/dirone/myfile.txt
-
FILEが単一のトークンに展開されていることに注意してくださいdir/dirtwo/myfile.txt\ndir/dirone/myfile.txt\n
。どうして?xargs
トークンは(-0
スイッチを使用して)NULで区切られ、2つのファイル名の間にNUL文字がないことを伝えたためです。
それで、元のコマンドに戻ると、次のようになります... | xargs -0 -I FILE sh -c "ls FILE"
。
ls dir/dirtwo/myfile.txt
dir/dirone/myfile.txt
したがって、1つをリストし、2つ目を実行しようとします。そのため、「アクセスが拒否されました」というメッセージが表示されます。2番目のファイルは実行可能ではありません。
お気づきのとおり、に-print0
オプションを追加find
すると問題が解決します。このオプションを使用するfind
と、トークンの間にNUL文字が挿入されます。xargs
この-0
オプションを使用すると、同じ文字が期待されます。同様に、ちょうど残し-0
のオフオプションをxargs
両方のために解き問題をfind
とxargs
、デフォルトでは区切り文字として使用する空白。
-print0
および-0
オプションは、ファイル名が(スペースはトークン区切り文字と見なされるデフォルトの動作を壊す)、スペースを含めることができる場合に便利です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加