2016-10-06 4 views
0

後のオペランドは、世界の書き込み可能なファイルを修正しようとすると、以下のエラー取得:ここます。chmod:行方不明+ tの

chmod: missing operand after a+t 

は私のコード

df --local -P | awk {'if (NR!=1) print $6'} | xargs -I '{}' find '{}' -xdev -type d -perm -0002 -a ! -perm -1000 2>/dev/null | xargs chmod a+t 

は任意の考えですか?

+1

'xargs'の代わりに' -exec'を使用した場合、この問題(またはいくつかの問題)は発生しません。 –

+1

GNU 'xargs'をお持ちの場合は、' --no-run-if-empty'(別名 '-r')オプションを使用すると、引数がない場合でもコマンドを一度実行しないようにすることができます(POSIXおそらく歴史的な先例に敬意を払って、おそらくそれは本当に良い考えのように思えたからです)。しかし、あなたは 'xargs'を使わないようにするのが最善です。 –

+0

@ JonathanLefflerまだ引数がないときにコマンドを呼び出すのはなぜですか?それは未展開のglobパターンに何も一致していなくても役に立たない引数を渡しているようなものです。 – Kaz

答えて

3

xargsの必要は全くここにありません - それはあなたのバグの原因だ、とあなたは、スペースや引用符(またはリテラルバックスラッシュ)とディレクトリ上のコンテンツを搭載していた場合さらにバグの原因になりますでその名前。

  • のGNU xargsの(しかし、BSDないxargsの)その入力であれば何引数なしでコマンドを呼び出します。

    { 
        read _       # consume header 
        while IFS= read -r dirname; do # ...iterate over later lines... 
        find "$dirname" -xdev -type d \ 
         '(' -perm -0002 -a ! -perm -1000 ')' \ 
         -exec chmod a+t '{}' + 2>/dev/null 
        done 
    } < <(df --output=target --local) # tell df to emit only the one column you want 
    

    xargsのは、このコードのバグの発生源である理由を明確にします内容がありません。これはすぐにあなたの直面する問題です。

  • すべてのPOSIX準拠のxargs実装では、引用符とバックスラッシュをパース(消費)し、空白で入力を分割しない限り(例えば、-0 [NULで区切られた入力を必要とする] GNU版-d $'\n' [改行文字区切り文字で正しく動作するように])。つまり、コンテンツが/media/Movie Name With Spacesにマウントされている場合、xargsは/media/Movie,Name,With、およびSpacesに対して別々にfindを実行しようとしています。 /media/Movie Name With Spaces "And Quotes"も同じように実行されますが、And Quotes(空白がない!)を1つの単語として使用します。 -exec somecommand {} +は、それぞれの呼び出しに収まるようsomecommandにできるだけ多くの引数を渡すだけxargs somecommandが行うように、:

また、あなたのfindコードは、現代(2006時代)POSIX拡張を使用している場合は、ここでxargsを使っへの効率の利点がありません。

1

あなたはchmodに引数を提供しない場合は、この問題が発生:

$ chmod a+x 
chmod: missing operand after ‘a+x’ 
Try 'chmod --help' for more information. 

をので、おそらく、コマンド:あなたが一致して任意のディレクトリを持っていない、つまり

df --local -P | awk {'if (NR!=1) print $6'} | \ 
     xargs -I '{}' find '{}' -xdev -type d -perm -0002 -a ! -perm -1000 2>/dev/null 

は、任意の出力を生成されていません指定されたディレクトリ内で検索するための制約が必要です(perm)。このコマンドを実行する場合は、chmodを付けずに実行してください。

関連する問題