我需要编写一个 shell 脚本,从文件中获取目录列表(目录位于不同的行上),然后对于每个文件路径,它会.hiddenfile
在每个目录中创建一个隐藏的虚拟文件(例如)。
瞧,我试图解决的问题是将空目录提交到源代码管理中,而我们使用的 Git 会忽略空文件。但是,我想知道是否可以重复使用此解决方案(即脚本获取目录列表并在每个目录中创建或编辑文件的部分)来解决其他问题。
目录列表将是绝对的,如下所示directories.txt
::
/Users/johnnydoe/dir1/
/Users/johnnydoe/dir2/subdir2_1/
/Users/johnnydoe/dir3/subdir3_1/subdir3_2/
/Users/johnnydoe/dir4/
...
的内容.hiddenfile
实际上是任意的。它只需要包含一些内容,以便 git 可以像这样提交文件:
# don't leave me out of source control
我只是不确定使用什么 Unix 命令来实现这一点。
顺便说一下,我正在使用 Mac OS X 版本的 Unix,如果这很重要的话。
如有任何建议,我们将不胜感激。
答案1
假设你的目录名或多或少是合理的(空格是可以的)这应该可以工作:
while read -r n; do \
echo "# don't leave me out of source control" > "$n"/.hiddenfile; \
done < dirlist.txt
此脚本将遍历 中的目录列表dirlist.txt
,并将每行保存为$n
。然后它使用将所需的文本打印到每个目录中的echo
文件中。.hiddenfile
答案2
xargs 非常适合针对列表中的每个参数执行命令。
例如(cygwin,OS X 也有 xargs):
$ find ~/tmp/ -type d | xargs.exe -Iz echo echo $RANDOM \> "z/.hidden" |sh
$ find ~/tmp -type f -name \.hidden |head -n4
/home/jaroslav/tmp/.hidden
/home/jaroslav/tmp/Data/.hidden
/home/jaroslav/tmp/Data/Meshes/.hidden
/home/jaroslav/tmp/Data/Meshes/actors/.hidden
find ~/tmp -type d
可以替换为cat /path/dirlist.txt
管道的第一部分生成目录列表。第二部分创建一个命令,该命令将回显随机数(bash)并将其写入找到的目录中的文件中。管道的最后一部分执行这些命令。
答案3
使用“一行”代码tee
:
echo "# don't leave me out of source control" |
tee $( while read -r; do echo "$REPLY/.hiddenfile"; done < directories.txt) \
> /dev/null