在目录下查找完整路径和文件名,然后将其作为参数传递给可执行文件

Mit*_*ril 5 linux command-line shell find xargs

我想.txt在一个目录下找到所有的完整路径和文件名,并传递给一个可执行文件./thulac

我花了一些时间才到达:

find /mnt/test -name "*.txt" -print0 |xargs -l bash -c './thulac < $0' 
Run Code Online (Sandbox Code Playgroud)

但这只能找到完整路径。

带有多个参数的 xargs 中 ,我看到:

echo argument1 argument2 argument3 | \
   xargs -l bash -c 'echo this is first:$0 second:$1 third:$2' | xargs
Run Code Online (Sandbox Code Playgroud)

我想要实现的是这样的:

find /mnt/test -name "*.txt" -print0 -printf "%f" | \
   xargs -0 bash -c './thulac < $0 > $1' 
Run Code Online (Sandbox Code Playgroud)

虽然在这里,当有多个文件时xargs无法正确拆分-print0 -printf "%f"为两个参数,这让我感到困惑。


例子:

find /mnt/test -name "*.txt" -print0 -printf "%f" | \
   xargs -0 -I bash -c './thulac < $0 > /mnt/tokenized/$1'
Run Code Online (Sandbox Code Playgroud)
  1. 如果/mnt/test只有一个文件,则上述命令确实有效。

  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
    
    Run Code Online (Sandbox Code Playgroud)

    如您所见,xargs将两条路径混合在一起/mnt/tokenized/test.txt/mnt/test/test33.txt,从而导致错误No such file or directory

如何使它工作?

ami*_*sax 1

是你的 find 命令有问题。
要分隔两个名称,请在 printf 格式中包含空格

find /mnt/test -name "*.txt"  -print0 -printf " %f\n"
                                               ^ ( note the space above)
Run Code Online (Sandbox Code Playgroud)