次のコマンドがあります。
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 ...
)を使用して注意する必要があります。"
@
答え2
二重引用符を一重引用符に変更すると、テストケースが修正されますが、GNUについて知りたい場合がありますparallel
。
次のように同じことができます。
parallel echo {/} ::: /some/path/*dat
(一部のシェルでは中括弧を引用する必要があるかもしれません。)
よりきれいな構文に加えて、複数のparallel
コマンドが同時に実行されます。
2番目の例は次のとおりです。
parallel octave --silent --eval "\"somefunction('{/}', '{}', ...)\"" ::: /some/path/*dat
(引用文は2回評価されますので、必ず引用文の中に入れなければなりません。)
答え3
# 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