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)
如果/mnt/test只有一个文件,则上述命令确实有效。
但是如果/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。
如何使它工作?
是你的 find 命令有问题。
要分隔两个名称,请在 printf 格式中包含空格
find /mnt/test -name "*.txt" -print0 -printf " %f\n"
^ ( note the space above)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2921 次 |
| 最近记录: |