通过终端

时间:2016-06-21 03:41:49

标签: bash

我正在尝试在直接位于当前分支下的多个目录中的文件列表上运行一系列命令。

示例层次结构如下:

/tmp
  |-1
  | |-a.txt
  | |-b.txt
  | |-c.txt
  |-2
  | |-a.txt
  | |-b.txt
  | |-c.txt

/tmp目录中,我正在我的提示符处,我正在尝试通过将a.txt文件重命名为d.txt来运行命令。

如何让它进入每个目录并重命名文件?我已经尝试了以下内容,但它不起作用:

for i in ./*; do
  mv "$i" $"(echo $i | sed -e 's/a.txt/d.txt/')"
done

它不会跳转到每个目录。我还尝试让它为我创建文件,或者从当前目录下每个层次结构下的文件夹只有1个文件夹深,但是使用它不会起作用:

for x in ./; do
  mkdir -p cats
done

for x in ./; do
  touch $x/cats.txt
done

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

将以下脚本放在基本目录中

#!/bin/bash
# Move  'a.txt's to 'd.txt's recursively
mover()
{
CUR_DIR=$(dirname "$1")
mv "$1" "$CUR_DIR/d.txt"
}
export -f mover
find . -type f -name "a.txt" -exec bash -c 'mover "$0"' {} \;

并执行它。

注意:

如果您希望更具创新性并概括脚本,您可以接受目录名称作为脚本的参数进行搜索,并将目录名称传递给find

答案 1 :(得分:1)

> for i in ./*; do

根据您自己的说明,这会将./1然后./2分配给i。这些都不匹配任何实际文件。你想要

for i in ./*/*; do

另外,shell完全能够使用glob模式替换简单的字符串。这也恰巧解决了问题,因为当你$i时没有引用echo

  mv "$i" "${i%/a.txt}/d.txt"