如何使用bash为另一个文件夹中的每个目录创建一个新文件?

时间:2019-04-12 07:02:55

标签: bash filesystems command-line-interface

说我有一个像这样的文件结构:

stuff/
  foo/
   foo1.txt
   foo2.txt
  bar/
   bar1.txt
other/

我想要一个bash命令,在这种情况下stuff/查找当前目录中的所有目录,并在另一个目录中创建具有这些目录名称的文件,在这种情况下other/具有所需的目录扩展例如.csv

结果如下:

stuff/
  foo/
   foo1.txt
   foo2.txt
  bar/
   bar1.txt
other/
  foo.csv
  bar.csv

2 个答案:

答案 0 :(得分:1)

“您尝试了什么”的问题有点疑问,但是我会纵容您。

要列出所有目录,我们可以使用find

$ cd stuff
$ find . -mindepth 1 -maxdepth 1 -type d
./bar
./foo

我们可以将其传递到while循环中,该循环使用read -r将每个连续的目录名称提取到变量中,此处为dirname

$ find . -mindepth 1 -maxdepth 1 -type d | while IFS="" read -r dirname; do echo $dirname; done
./bar
./foo

最后,我们可以运行echo来创建具有所需名称的文件,而不用touch设置目录名:

$ find . -mindepth 1 -maxdepth 1 -type d | while IFS="" read -r dirname; do touch ../other/$dirname.csv; done
$ ls ../other
bar.csv  foo.csv

替代方法!因为有很多方法可以给猫皮。

我们可以使用ls -d */列出所有目录:

$ ls -d */
bar/  foo/

然后我们使用sed剥离/并添加路径和文件扩展名:

$ ls -d */ | sed 's#\(.*\)/#../other/\1.csv#'
../other/bar.csv
../other/foo.csv

然后,我们使用xargs为以下每个文件名运行touch

$ ls -d */ | sed 's#\(.*\)/#../other/\1.csv#' | xargs touch
$ ls ../other
bar.csv  foo.csv

答案 1 :(得分:0)

尝试一下:

#! /bin/bash

function read_and_cp() {
    for file in `ls $1`
    do
        if [ -d $1/${file} ]; then
            touch $2/${file}.csv
            read_and_cp $1/${file} $2
        fi
    done
}

read_and_cp stuff other