bash中的通配符

时间:2015-03-25 15:04:14

标签: bash wildcard

假设我有两个文件夹(存储在我的主目录中)dir1dir2两个文件夹都包含一个名称相同的文件,比如hello_world.txt。但是,每个hello_world.txt文件的内容不同

我能做到

ls dir*/hello_world.txt
dir1/hello_world.txt  dir2/hello_world.txt

将列出这两个文件。太棒了!但...

如何制作两个文件的副本,使用*外卡, 在同一时间重新命名它们时间。即我希望输出

hello_world1.txt hello_world2.txt

并将其放在我的主目录中。

2 个答案:

答案 0 :(得分:2)

for循环确实是最好的解决方案:它清晰,可维护,尽管是多线的,但非常简单:

i=0
for hw in dir*/hello_world.txt; do
    dest="$HOME/${hw##*/}"
    cp "$hw" "${dest%.*}$((++i)).txt"
done

输入:

$ tree
.
├── dir1
│   └── hello_world.txt
└── dir2
    └── hello_world.txt

输出:

$ tree
.
├── dir1
│   ├── hello_world.txt
└── dir2
    └── hello_world.txt
$ (cd ~ && tree)
.
├── hello_world1.txt
└── hello_world2.txt

答案 1 :(得分:0)

GNU Coreutils有一个-bcp的选项,可以避免覆盖文件。

cp -b numbered dir*/hello_world.txt $HOME

但是,这并不能完全控制生成的名称。

有关详细文档,请参阅Coreutils文档中的info coreutils cpBackup options