创建目录列表

创建目录列表

我在文本文件 ( 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`

相关内容