次のコマンドがあります。
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 @`','@',...))"
編集2:
実際のコマンドは次のとおりです。
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"
デフォルトでは、ディレクトリにファイルセットがあり、このコマンドはそのファイルをインポートし、結果を別のディレクトリに出力して結果が存在しないことを確認します。
したがって、フルパスを含むファイルと基本名のみを含むファイルが必要です。
どのように機能させるのですか?最初に簡単な例を見ると、これをより明確に理解するのに役立ちます。
ベストアンサー1
ls /some/path/*dat | xargs -n 1 -I @ sh -c 'echo `basename "@"`'
コードで早すぎますbasename
。
パスにスペースやタブがないかどうかわからない場合(-d \\n
またはfind ... -print0 | xargs -0 ...
)を使用して注意する必要があります。"
@