私は次のコマンドを持っています:
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"
基本的に、ディレクトリに一連のファイルがあり、このコマンドはこれらのファイルをフィードして別のディレクトリに結果を出力し、結果がまだそこにないかどうかを確認します。
したがって、フルパスのファイルとベース名のみのファイルの両方が必要です。
それを機能させる方法は?最初の簡単な例は、これを明確にするのに役立ちます。
ls /some/path/*dat | xargs -n 1 -I @ sh -c 'echo `basename "@"`'
basename
は、コードの早い段階で実行されます。
パスにスペースやタブがないかどうかわからない場合は、-d \\n
(またはfind ... -print0 | xargs -0 ...
)を使用し、"
の周りの@
に注意してください。
テストケースは、二重引用符を一重引用符に変更するだけで修正できますが、GNU parallel
について知りたい場合があります。
あなたはこのように同じことをすることができます:
parallel echo {/} ::: /some/path/*dat
(一部のシェルでは、中括弧を引用する必要がある場合があります。)
構文が明確になるだけでなく、parallel
は複数のコマンドを一度に実行します。
2番目の例は次のようになります。
parallel octave --silent --eval "\"somefunction('{/}', '{}', ...)\"" ::: /some/path/*dat
(2回評価されるため、引用符内に引用符を含める必要があります。)
# 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