我正在尝试使用 find 命令来编辑许多不同子目录中名为“msf.txt”的文件,并且我希望它采用与目录中共享相同扩展名的任何文件相同的文件名和扩展名。举个例子,假设我位于一个包含 msf.txt 文件和 msf-01.txt 文件的子目录之一。我想将 msf.txt 重命名为 msf-01.txt。我想在许多子目录中自动执行此操作,但仅在目录名称中包含短语“data”的子目录中执行此操作。有人可以提供一些建议吗?我更喜欢使用像 find 这样的东西。
这就是当前目录的样子
main/
|--sub01
├── data/
│ ├── mgw.txt
│ ├── mgw-01.txt
├── pictures/
│ ├── bootstrap1.png
│ └── bootstrap2.png
└── extra/
├── stuff.txt
|--sub02
├── data/
│ ├── mgw.txt
│ ├── mgw-02.txt
├── pictures/
│ ├── bootstrap1.png
│ └── bootstrap2.png
└── extra/
├── stuff.txt
这就是我想要的样子,数据目录中的 .txt 文件旨在包含 mgw.txt 文件中的内容
main/
|--sub01
├── data/
│ ├── mgw-01.txt
├── pictures/
│ ├── bootstrap.png
│ └── bootstrap.png
└── extra/
├── stuff.txt
|--sub02
├── data/
│ ├── mgw-02.txt
├── pictures/
│ ├── bootstrap1.png
│ └── bootstrap2.png
└── extra/
├── stuff.txt
答案1
也许是这样的:
#! /bin/zsh -
would-do() print -r -- "$@"
for f (**/data/mgw.txt(N)) {
others=($f:r-*.txt(N))
if (($#others)); then
would-do mkdir -p $f:h:h/backup &&
would-do mv $others $f:h:h/backup/ &&
would-do mv $f $others[1]
fi
}
将定义更改would-do
为would-do() "$@"
实际执行的操作。