web-dev-qa-db-ja.com

xargsの下にベース名をエコーし​​ますか?

私は次のコマンドを持っています:

ls /some/path/*dat | xargs -n 1 -I @ sh -c "echo `basename @`"

ディレクトリ/some/path/含む:

/some/path/a
/some/path/b
/some/path/c
/some/path/d

出力を取得したい:

a
b
c
d

しかし、私はまだフルパスを取得しています。私は何が間違っているのですか?

編集:ところで、私はもっと簡単な方法があることを知っています、私は代わりにbasnameを実行することができます

echo `basename @`

しかし、私は次のような複雑なコマンドを実行する必要があります

octave --silent --eval "somefunction('`basename @`','@',...))"

edit2:

実際のコマンドは次のとおりです。

 ls ~/phd/data/conll2012/dev.megam/*dat | xargs -P 16 -n 1 -I@ timeout -k 1s 15m sh -c "if [ ! -f '~/phd/xp/conll2012/dev.megam/@.$epsilon$mink$minn$alpha' ]; then octave --silent --eval \"xprp('~/phd/xp/conll2012/dev.megam/@.$epsilon$mink$minn$alpha.rp','@',$alpha,$mink,$minn,$epsilon);\" 2>> ~/xpgrid.log;fi"

基本的に、ディレクトリに一連のファイルがあり、このコマンドはこれらのファイルをフィードして別のディレクトリに結果を出力し、結果がまだそこにないかどうかを確認します。

したがって、フルパスのファイルとベース名のみのファイルの両方が必要です。

それを機能させる方法は?最初の簡単な例は、これを明確にするのに役立ちます。

6
davcha
ls /some/path/*dat | xargs -n 1 -I @ sh -c 'echo `basename "@"`'

basenameは、コードの早い段階で実行されます。

パスにスペースやタブがないかどうかわからない場合は、-d \\n(またはfind ... -print0 | xargs -0 ...)を使用し、"の周りの@に注意してください。

3
Hauke Laging

テストケースは、二重引用符を一重引用符に変更するだけで修正できますが、GNU parallelについて知りたい場合があります。

あなたはこのように同じことをすることができます:

parallel echo {/} ::: /some/path/*dat

(一部のシェルでは、中括弧を引用する必要がある場合があります。)

構文が明確になるだけでなく、parallelは複数のコマンドを一度に実行します。

2番目の例は次のようになります。

parallel octave --silent --eval "\"somefunction('{/}', '{}', ...)\"" ::: /some/path/*dat

(2回評価されるため、引用符内に引用符を含める必要があります。)

3
ams
 # find all my Perl file names with *.pl or *.pm ext sorted 
 find src/ -name '*.pm' -o -name '*.pl'  \
  | xargs -n 1 -I @ sh -c 'echo `basename "@"`' | sort
0
Yordan Georgiev