与此question
类似但我想让文件名与附加“_info.txt”的目录同名。
我试过这个
#!/bin/bash
find . -mindepth 1 -maxdepth 1 -type d | while read line; do
touch /Users/xxx/git/xxx/$line/$line_info.txt
done
在每个子目录中创建“.txt”。
我错过了什么?
答案 0 :(得分:1)
关键错误是下划线字符是bash变量名称的有效字符:
$ a=1
$ a_b=2
$ echo $a_b
2
有几种解决方法:
$ echo "$a"_b
1_b
$ echo $a'_b'
1_b
$ echo ${a}_b
1_b
至于你的任务,这是一个快速的方法:
find . -mindepth 1 -maxdepth 1 -type d -printf "%p_info.txt\0" | xargs -0 touch
find -printf
打印每个目录的路径,printf
的{{1}}不受其后的下划线的影响。然后,%p
将文件名传递给xargs
的少量运行,从而使文件的创建速度更快。
答案 1 :(得分:0)
想出来:
#!/bin/bash
find . -mindepth 1 -maxdepth 1 -type d | while read line; do
touch /Users/xxxx/git/xxxx/$line/"$line"_info.txt
done
我想我仍然可以做“找到”。更好,因为我必须在目录中运行我想要添加的文件。理想情况下,它应该可以在任何地方运行。
答案 2 :(得分:0)
试试这个脚本:
#!/bin/bash
find $1 -type d | while read line
do
touch "$line/$(basename $( readlink -m $line))_info.txt"
done
将其另存为appendinfo
并将其作为
./appendinfo directory_name_which_include_symlinks
<强>之前强>
ssam@udistro:~/Documents/so$ tree 36973628
36973628
`-- 36973628p1
`-- 36973628p2
`-- 36973628p3
3 directories, 0 files
<强>后强>
ssam@udistro:~/Documents/so$ tree 36973628
36973628
|-- 36973628_info.txt
`-- 36973628p1
|-- 36973628p1_info.txt
`-- 36973628p2
|-- 36973628p2_info.txt
`-- 36973628p3
`-- 36973628p3_info.txt
3 directories, 4 files
注意: readlink通过遵循符号链接规范化路径。例如,如果您不打算提供.
等参数,则不需要这样做。
答案 3 :(得分:0)
如果您根本没有递归,则不需要find
。要遍历子目录,您只需要
for dir in */; do
touch /Users/xxxx/git/xxxx/"$dir/${dir%/}_info.txt"
done
顺便提一下,请注意变量总是需要双引号。
答案 4 :(得分:0)
试试这个:
find . /Users/xxx/git/xxx/ -mindepth 1 -maxdepth 1 -type d -exec bash -c 'touch ${0}/${0##*/}_info.txt' {} \;
答案 5 :(得分:-1)
您错过了该文件夹的路径。我想你打算写
touch "./$folder/*/*_info.txt"
虽然只有从正确的目录开始,这仍然有效。你应该写一些像
这样的东西touch "/foo/bar/user/$folder/*/*_info.txt"
然而,你使用“* / * _ info.txt”非常......有问题......至少可以说。我不是bash专家,但我不指望它会起作用。读取目录中的所有内容(例如,使用“查找”,仅接受目录)和输出“触摸”的管道将是更好的方法。