将xargs Bash命令转换为Windows PowerShell以进行IPFS固定

aor9mmx1  于 2023-05-17  发布在  Shell
关注(0)|答案(4)|浏览(256)

我不是IPFS和Linux方面的Maven,但我会尽我所能描述一个问题。
这里有一个txt文件,其中包含行,表示文件名列表及其IPFS CID(我假设)。
该文件的结构如下:

"description of a file" "IPFS CID"  
description1 CID1.....shnpnhzuquz3ho7vvabqjyide  
description2 CID2.....keg4rklbzenppnyrjk554h5ru

还有一个描述,如何用linux命令来做,应该把这个文件中的每一行都固定到IPFS。

cat file.txt | xargs -L1 bash -c 'ipfs pin add $1'

如何通过Windows PowerShell执行此命令?
我试着输入以下内容(通过这个问题的类比-Convert xargs Bash command to PowerShell?

cat file.txt | %{ipfs pin add $_}

但它产生错误:

Error: invalid path "description1 CID1.....shnpnhzuquz3ho7vvabqjyide": selected encoding not supported  
Error: invalid path "description2 CID2.....keg4rklbzenppnyrjk554h5ru": selected encoding not supported  
.....
zsbz8rwp

zsbz8rwp1#

  • 更新 *:
  • 结果是,真实的的输入文件没有 * 头行,而他的答案假设它有。

我将答案保持原样,因为将来的读者可能会对处理标题行的技术感兴趣。

  • 您的输入文件有一个标题行,需要跳过它(您的bash命令将尝试执行标题中包含单词ofipfs pin add)。
  • 从每一行中,必须提取第二个空格分隔的标记并传递给ipfs pin add,这就是xargs -L1bash -c '... $1' * 隐式 * 组合所做的事情。
cat file.txt | 
  select -Skip 1 | # skip header line
  % {              # process each line
    ipfs pin add (-split $_)[1]  # Extract 2nd whitespace-separated token
  }

注意事项:

  • 在Windows上,cat是PowerShel的Get-Content cmdlet的内置 * 别名 *,在类Unix平台上,它指的是标准实用程序/bin/cat
  • selectSelect-Object的内置别名,并且,使用文本行作为输入,

Select-Object -Skip 1等同于tail -n +2

  • %ForEach-Object的内置别名,它通过script block{ ... })处理每个输入对象,其中自动$_变量引用手头的输入对象。
  • -split operator的一元形式用于将每行拆分为空格分隔的标记,[1]从结果数组中提取第二个标记。
  • 另一种方法是使用.Split().NET字符串 * 方法 *,如您对自己的问题所做的评论中所示:在本例中,$_.Split(" ")[1]等效于(-split $_)[1]
  • 但是,一般来说,-splitoperator 更通用,并且是PowerShell惯用的-有关背景信息,请参阅this answer

注意:我不熟悉ipfs,但请注意,ipfs pin add的文档中只提到了将 * 路径 * 作为参数传递,而不是CID--ipfs pin remote add支持CID。
一种替代方法是将输入文件视为(空格)分隔的文件,并使用Import-Csv将其解析为对象,这允许您按列名提取列值:

Import-Csv -Delimiter ' ' file.txt | 
  ForEach-Object {
    ipfs pin add $_.'IPFS CID'
  }

由于**ipfs pin add支持 * 多个 * 参数**,因此您可以简化并加快命令的执行速度,具体如下:只需要 * 一个 * ipfs pin add调用

ipfs pin add (Import-Csv -Delimiter ' ' file.txt).'IPFS CID'

这利用了PowerShell的member-access enumeration功能和PowerShell在调用外部实用程序时将 * 数组 * 值转换为 * 单个参数 * 的能力。
请注意,至少在假设情况下,您可能遇到的命令行长度有特定于平台的限制(这是只有xargs会自动处理的事情,通过将参数划分为尽可能少的调用)。

bhmjp9jg

bhmjp9jg2#

而不是尝试在powershell上执行此操作,使用powershell转到WSL,设置IPFS(Kubo for Go使用Linux指南)并使用此命令固定文件。手动删除第一行的标题。

$ cat /mnt/pathtoyourfile/file.txt | shuf | xargs -P8 -L1 bash -c 'timeout 2m ipfs pin add $1

有一点要注意:你的repo可能不在默认位置,并且windows env变量不能带入WSL,所以使用以下命令将你的路径添加到.bashrc

$ vim ~/.bashrc

添加导出命令

$ export IPFS_PATH=/mnt/d/yourIPFSrepo/.ipfs

esc,键入:wq并输入以保存和退出。使用

$ source ~/.bashrc

将其加载到当前的powershell以使更改立即生效。使用ipfs init检查节点初始化位置。启动另一个powershell bash窗口来验证路径总是在启动时更改为您指定的路径。

ut6juiuv

ut6juiuv3#

我需要澄清,文件中没有标题。所以我编辑了初始命令。目前,有两个命令都运行良好:
1:

Get-Content file.txt | 
    ForEach-Object {
      ipfs pin add (-split $_)[1]  # Extract 2nd whitespace-separated token
      }

和2:

cat file.txt | %{ipfs pin add $_.split(" ")[1]}

我认为在固定特定线路时存在问题。意外的是第11行。anonymouspanda是另一个用户,我想我也遇到了同样的问题。

hk8txs48

hk8txs484#

由于条目#11,它在固定10之后开始挂起。我删除了条目#11之前的5个条目,现在是条目#6。代码在挂起之前固定了5个条目,并且挂起在6上。我不确定是什么原因导致它挂在特定的条目,但这段代码在powershell中运行得很好:

cat file.txt | %{ipfs pin add $_.split(" ")[1]}

相关问题