在由分隔符拆分的文件的每一行上将mkdir压缩到mkdir?

时间:2018-01-17 16:26:39

标签: linux bash xargs

试图弄清楚如何逐行遍历$(document).ready(function () { $("#<%=itemOne.ClientID%>").keyup(function () { if ($(this).val().length > 2) { $("#<%=addItem.ClientID%>").removeAttr('disabled'); } else { $("#<%=addItem.ClientID%>").attr('disabled', 'disabled'); } }).trigger('keyup'); }); 文件(filemappings.txt),然后使用.txttab)作为分隔符拆分每一行,以便我们可以创建选项卡右侧指定的目录(\t)。

读取filemappings.txt,然后按mkdir -p

拆分每一行
tab

会变成

server/ /client/app/
server/a/   /client/app/a/
server/b/   /client/app/b/

mkdir -p /client/app/ mkdir -p /client/app/a/ mkdir -p /client/app/b/ 会是一个不错的选择吗?为什么或为什么不呢?

5 个答案:

答案 0 :(得分:4)

cut -f 2 filemappings.txt | tr '\n' '\0' | xargs -0 mkdir -p 

xargs -0非常适合矢量操作。

答案 1 :(得分:3)

您已经有答案告诉您如何使用xargs。根据我的经验,xargs在您想要在易于检索的参数列表上运行简单命令时非常有用。在您的示例中,xargs会做得很好。但是,如果您想执行比运行简单命令更复杂的操作,则可能需要使用while循环:

while IFS=$'\t' read -r a b
do
  mkdir -p "$b"
done <filemappings.txt

在这种特殊情况下,read a b将读取由定义的IFS分隔的两个参数,并将每个参数放在一个不同的变量中。如果你是一个单行爱好者,你也可以这样做:

while IFS=$'\t' read -r a b; do mkdir -p "$b"; done <filemappings.txt

通过这种方式,您可以读取多个参数以应用于任何系列的命令; xargs不适合做的事情。

使用read -r将逐字地读取一行,而不管其中是否有任何反斜杠,以防您需要读取带有反斜杠的行。

另请注意,某些操作系统可能允许选项卡作为文件或目录名称的一部分。这将打破使用选项卡作为参数的分隔符。

答案 2 :(得分:1)

sed -n '/\t/{s:^.*\t\t*:mkdir -p ":;s:$:":;p}' filemappings.txt | bash
  1. sed -n:仅适用于包含tab(分隔符)
  2. 的行
  3. s:^.*\t\t*:mkdir -p ::将所有内容从行预设更改为tabmkdir -p
  4. | bash:告诉bash创建文件夹

答案 3 :(得分:1)

正如其他人所指出的那样,\t字符也可以是文件或目录名的一部分,以下命令可能会失败。假设问题代表输入文件的真实形式,可以使用:

  $ grep -o -P '(?<=\t).*' filemappings.txt | xargs -d'\n' mkdir -p

它使用-P perl样式的正则表达式来获取\t(TAB)字符后面的单词,然后使用-d'\n'mkdir -p作为{{1}的单个输入提供}。

答案 4 :(得分:0)

使用GNU Parallel,它看起来像这样:

parallel --colsep '\t' mkdir -p {2} < filemapping.txt