我见过一款名为 Structurer 的 Mac 应用(这里有一个视频http://www.youtube.com/watch?v=kXRjneFTs6Q),其文件和文件夹的结构如下:
/folder1
/folder2
/file1
/folder2.1
/file2.1
将在现有位置创建这些文件和文件夹。
Ubuntu 中有类似的东西,或者我如何构建一个 shell 脚本来获得类似的东西?
如果可能的话,使用模板创建文件也将会很酷。
答案1
棘手的部分是文件和文件夹以相同的方式显示,并且没有简单的方法来区分它们。对于文件 2.1,没有办法判断它 ( /folder2/folder2.1/file2.1
) 实际上是文件夹还是文件夹 2.1 内的文件。
是的,您的描述中提到了这个词*file*
,所以我们知道您指的是文件,但对于程序来说,它如何分辨呢?程序可能会将文件与路径区分开来,因为一个文件后面跟着另一个文件,缩进级别相同。但是,这会导致一组复杂而令人困惑的规则。
我建议你使用关键字或完全限定名称。最简单的方法是:
/文件夹1/
/文件夹2/
/文件夹2/文件1
/folder2/folder2.1/
/folder2/folder2.1/file2.1
尾部斜杠表示“这是一个文件夹,而不是文件”。然后,您可以使用类似这样的简单脚本来创建目录结构。关于此脚本的几个警告。
- 必须首先创建更高级别的目录。
- 我在路径前面添加了一个“。”,以便创建的所有目录都与运行脚本的目录相关。
- 我没有对 dir/path 文件的内容进行错误检查。
#!/bin/sh -v # # builds a directory and file structure. # directories must exists before referenced or file in the directory declared. # # sample input looks like (without the leading #): # /folder1/ # /folder2/ # /folder2/file1 # /folder2/folder2.1/ # /folder2/folder2.1/file2.1 # # make sure we have our one and only input parameter. if [ $# != 1 ]; then echo "Usage: `basename $0` input_file_name" echo "input_file_name contains absolute dir paths with a trailing slash," echo "or absolute file path/name with no trailing slash." exit 1 fi # get the file name from the command line FILE=$1 # make sure the input parameter specifies a file. if [ ! -e ${FILE} ]; then echo "Sorry, the file ${FILE} does not exist." exit 1 fi for LINE in $(cat $FILE) do LAST=$(echo ${LINE} | awk -F/ '{print $(NF)}') # if file ends with a slash, this value is blank, if it is no slash, this is the file name. if [ "${LAST}XXX" = "XXX" ]; then # is empty, so it is directory, future feature to check exist already mkdir ".${LINE}" else # is not empty, so it is a file touch ".${LINE}" fi done exit 0
这将创建输入文件中所示的目录和文件。如果调用了脚本create.sh
并且您已执行,chmod 755 create.sh
则命令./create.sh data
将生成数据文件中所述的目录和文件。