我在文本文件 ( list.txt
) 中有一个名称列表,我想为该文件中包含的名称创建一个文件夹列表。我写了以下脚本,但它不起作用,我不知道出了什么问题:
#!/bin/tcsh
for name_id in `cat <path to list.txt>/list.txt` ; do
mkdir <name_id>${name_id}
该文件list.txt
和脚本位于同一文件夹中。
答案1
这对我有用:
xargs mkdir <list.txt
这是有效的,因为如果你给它多个参数,mkdir
它会很高兴地创建它可以创建的所有目录。xargs
只需通过用空格替换换行符来“展平”文本文件,从而mkdir
一次调用包含所有目录名称的一长串参数,而不是一次调用一个。
如果要添加固定前缀(或后缀,或两者):
xargs -I, mkdir prefix_, <list.txt
开关(在本例中为逗号)后面输入的任何内容都-I
将替换为从文件中读取的名称。
另一件事,我会添加引号,以防文本文件中的文件名中包含空格或其他“特殊”字符:
xargs -I, mkdir "," <list.txt
或者
xargs -I, mkdir "prefix_," <list.txt
答案2
在您的示例中,您令人困惑的 shell 脚本命令。您必须特别注意您使用的脚本语言,然后遵守其命令的语法。在您的示例中,您使用 Turbo C shell (tcsh),但是您随后混合了 Bash/Bourne shell 命令和语法。
如果您确实需要,可以使用以下方法tcsh
。假设我有这个示例文件:
$ cat afile
1
2
3
4
5
这个脚本:
$ cat cmd.csh
#!/bin/tcsh
foreach i (`cat afile`)
echo "$i"
end
运行它会产生以下输出:
$ ./cmd.csh
1
2
3
4
5
因此,为了完成任务,我们可以在mkdir
命令后面添加echo
:
$ cat cmd1.csh
#!/bin/tcsh
foreach i (`cat afile`)
echo "making directory: $i"
mkdir "$i"
end
现在当我们运行它时:
$ ./cmd1.csh
making directory: 1
making directory: 2
making directory: 3
making directory: 4
making directory: 5
导致目录被创建:
$ ls -l
total 32
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 1
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 2
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 3
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 4
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 5
-rw-rw-r--. 1 saml saml 11 Oct 16 18:47 afile
-rwxrwxr-x. 1 saml saml 86 Oct 16 18:56 cmd1.csh
-rwxrwxr-x. 1 saml saml 55 Oct 16 18:51 cmd.csh
答案3
如果您有 GNU Parallel,您可以执行以下操作:
parallel -q mkdir '<name_id>'{} < list.txt
与 xargs 相反,它可以正确处理特殊字符 - 例如 <、>、'、" 和空格。
GNU Parallel 是一个通用并行器,可以轻松地在同一台计算机或多台您可以通过 ssh 访问的计算机上并行运行作业。
安装
如果您的发行版未打包 GNU Parallel,您可以进行个人安装,不需要 root 访问权限。这样做可以在 10 秒内完成:
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
对于其他安装选项,请参阅http://git.savannah.gnu.org/cgit/parallel.git/tree/README
了解更多
查看更多示例:http://www.gnu.org/software/parallel/man.html
观看介绍视频:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
浏览本教程:http://www.gnu.org/software/parallel/parallel_tutorial.html
注册电子邮件列表以获得支持:https://lists.gnu.org/mailman/listinfo/parallel
答案4
你不需要循环。你可以做:
mkdir `sed 's/^/<name_id>/' <path to list.txt>/list.txt`