問題の源

問題の源

.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'
  1. /mnt/test上記のコマンドは、ファイルが1つしかない場合でも機能します。

  2. ただし、/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 {}結果からパスを削除するために使用されます。

おすすめ記事