421

指定された入力行ごとにxargsにコマンドを1回だけ実行させるにはどうすればよいですか? デフォルトの動作は、行をチャンクしてコマンドを 1 回実行し、複数の行を各インスタンスに渡すことです。

http://en.wikipedia.org/wiki/Xargsから:

/path -type f -print0 | を見つけます。xargs -0 rm

この例では、find は xargs の入力にファイル名の長いリストをフィードします。xargs は、このリストをサブリストに分割し、サブリストごとに rm を 1 回呼び出します。これは、この機能的に同等のバージョンよりも効率的です。

find /path -type f -exec rm '{}' \;

find に「exec」フラグがあることは知っています。別のリソースから実例を引用しているだけです。

4

13 に答える 13

459

以下は、入力にスペースが含まれていない場合にのみ機能します。

xargs -L 1
xargs --max-lines=1 # synonym for the -L option

マニュアルページから:

-L max-lines
          Use at most max-lines nonblank input lines per command line.
          Trailing blanks cause an input line to be logically continued  on
          the next input line.  Implies -x.
于 2008-10-13T22:32:42.510 に答える
23

から来るすべての行 (つまり、結果)に対してコマンドを実行したい場合find、何が必要xargsですか?

試す:

find コマンドのパス-type f -exec {} \;

リテラル{}はファイル名に置き換えられ、カスタムコマンドがそこで終了することを知る\;ためにリテラルが必要です。find

編集:

(あなたが知っていることを明確にする質問の編集後-exec

からman xargs:

-L max-linesコマンド ラインごとに最大でmax-lines の
空白以外の入力行 を使用します。末尾の空白があると、入力行は次の入力行に論理的に継続されます。-x を意味します。

空白で終わるファイル名を使用すると、問題が発生することに注意してくださいxargs

$ mkdir /tmp/bax; cd /tmp/bax
$ touch a\  b c\  c
$ find . -type f -print | xargs -L1 wc -l
0 ./c
0 ./c
0 total
0 ./b
wc: ./a: No such file or directory

-execしたがって、オプションを気にしない場合は、 -print0and を使用することをお勧めし-0ます。

$ find . -type f -print0 | xargs -0L1 wc -l
0 ./c
0 ./c
0 ./b
0 ./a
于 2008-10-13T22:50:22.007 に答える
21

指定された入力行ごとにxargsにコマンドを1回だけ実行させるにはどうすればよいですか?

-L 1は簡単な解決策ですが、ファイルにスペースが含まれている場合は機能しません。これは、find の-print0引数の重要な機能です。空白の代わりに '\0' 文字で引数を区切ります。次に例を示します。

echo "file with space.txt" | xargs -L 1 ls
ls: file: No such file or directory
ls: with: No such file or directory
ls: space.txt: No such file or directory

より良い解決策は、 を使用trして改行をヌル ( \0) 文字に変換してから、xargs -0引数を使用することです。次に例を示します。

echo "file with space.txt" | tr '\n' '\0' | xargs -0 ls
file with space.txt

呼び出し回数を制限する必要がある場合は、-n 1引数を使用して、入力ごとにプログラムを 1 回呼び出すことができます。

echo "file with space.txt" | tr '\n' '\0' | xargs -0 -n 1 ls

これにより、ブレークをヌルに変換するに、find の出力をフィルタリングすることもできます。

find . -name \*.xml | grep -v /target/ | tr '\n' '\0' | xargs -0 tar -cf xml.tar
于 2015-05-07T14:37:47.473 に答える
15

これら 2 つの方法も機能し、find! を使用しない他のコマンドでも機能します。

xargs -I '{}' rm '{}'
xargs -i rm '{}'

使用例:

find . -name "*.pyc" | xargs -i rm '{}'

pyc ファイルにスペースが含まれていても、このディレクトリの下にあるすべての pyc ファイルを削除します。

于 2014-08-15T00:49:07.017 に答える
11

別の選択肢...

find /path -type f | while read ln; do echo "processing $ln"; done
于 2012-12-18T09:58:38.677 に答える
9
find path -type f | xargs -L1 command 

は、あなたが必要とすることすべてです。

于 2008-10-13T23:14:31.193 に答える
4

次のコマンドは、すべてのファイル (-type f) を検索し、それらを使用して現在のフォルダーに/pathコピーします。ファイル名の後に引数を配置できるように、コマンド ラインでプレースホルダー文字を指定cpする if の使用に注意してください。-I %cp

find /path -type f -print0 | xargs -0 -I % cp % .

xargs (GNU findutils) 4.4.0 でテスト済み

于 2009-06-04T05:23:25.623 に答える
2

--max-lines または --max-args フラグをそれぞれ使用して、行数または引数 (各引数の間にスペースがある場合) を制限できます。

  -L max-lines
         Use at most max-lines nonblank input lines per command line.  Trailing blanks cause an input line to be logically continued on the next  input
         line.  Implies -x.

  --max-lines[=max-lines], -l[max-lines]
         Synonym  for  the -L option.  Unlike -L, the max-lines argument is optional.  If max-args is not specified, it defaults to one.  The -l option
         is deprecated since the POSIX standard specifies -L instead.

  --max-args=max-args, -n max-args
         Use at most max-args arguments per command line.  Fewer than max-args arguments will be used if the size (see  the  -s  option)  is  exceeded,
         unless the -x option is given, in which case xargs will exit.
于 2008-10-13T22:40:29.687 に答える
0

上記のTobiaの回答にコメントを追加するのに十分な評判がないようですxargs.Windowsプラットフォームで同じ方法を試してみたい私たちを助けるために、この「回答」を追加しています.

これは、Tobia がすばやくコーディングした「show」スクリプトと同じことを行う Windows バッチ ファイルです。

@echo off
REM
REM  cool trick of using "set" to echo without new line
REM  (from:  http://www.psteiner.com/2012/05/windows-batch-echo-without-new-line.html)
REM
if "%~1" == "" (
    exit /b
)

<nul set /p=Args:  "%~1"
shift

:start
if not "%~1" == "" (
    <nul set /p=, "%~1"
    shift
    goto start
)
echo.
于 2016-03-05T21:42:09.850 に答える
-3

現在のフォルダーまたはサブフォルダーのすべての build.xml に対して、ant タスク clean-all を実行します。

find . -name 'build.xml' -exec ant -f {} clean-all \;
于 2010-04-15T14:38:59.160 に答える
-3

あなたの例では、find の出力を xargs にパイプするポイントは、find の -exec オプションの標準的な動作は、見つかったファイルごとにコマンドを 1 回実行することです。find を使用していて、その標準的な動作が必要な場合、答えは簡単です。最初から xargs を使用しないでください。

于 2008-10-13T22:49:16.563 に答える