说我有一个像这样的文件结构:
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
答案 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