在具有唯一名称的所有子文件夹中创建空文件--bash

时间:2016-05-02 00:48:23

标签: linux bash

与此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”。

我错过了什么?

6 个答案:

答案 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专家,但我不指望它会起作用。读取目录中的所有内容(例如,使用“查找”,仅接受目录)和输出“触摸”的管道将是更好的方法。