.txt
ディレクトリ内のすべてのファイルのフルパスとファイル名を見つけて実行可能ファイルに渡したいと思います./thulac
。
到達するのに時間がかかりました。
find /mnt/test -name "*.txt" -print0 |xargs -l bash -c './thulac < $0'
しかし、これはフルパスのみを探します。
~から複数のパラメータを持つxargs 、理解します:
echo argument1 argument2 argument3 | \
xargs -l bash -c 'echo this is first:$0 second:$1 third:$2' | xargs
私が達成したいことは次のとおりです
find /mnt/test -name "*.txt" -print0 -printf "%f" | \
xargs -0 bash -c './thulac < $0 > $1'
ただし、ここではxargs
複数のファイルがある場合、2つのパラメータに正しく分割されていないため、混乱しています。-print0 -printf "%f"
例:
find /mnt/test -name "*.txt" -print0 -printf "%f" | \
xargs -0 -I bash -c './thulac < $0 > /mnt/tokenized/$1'
/mnt/test
上記のコマンドは、ファイルが1つしかない場合でも機能します。ただし、
/mnt/test
言語に関係なく複数のファイルがある場合:[root@localhost THULAC]# ls /mnt/test test33.txt test.txt [root@localhost THULAC]# find /mnt/test -name "*.txt" -print0 -printf "%f" | \ xargs -0 bash -c './thulac < $0 > /mnt/tokenized/$1' /mnt/test/test.txt: /mnt/tokenized/test.txt/mnt/test/test33.txt: No such file or directory
ご覧のとおり、2つのパス
xargs
が混在して/mnt/tokenized/test.txt/mnt/test/test33.txt
エラーが発生しますNo such file or directory
。
どのように機能させるのですか?
ベストアンサー1
find /tmp/test -name '*.txt' \
-exec bash -c './thulac < "$(readlink -f {})" > "/mnt/tokenized/$(basename {})"' \;
find を使用してファイルを検索し、結果に対してコマンドを実行します。この方法でbash -c 'command'
複数の$()を実行できます。
readlink -f {}
結果を生成するために使用されるフルパス。
basename {}
結果からパスを削除するために使用されます。