我正在尝试一次移动一堆文件,向上移动一个目录。
这是我尝试过的,但没有成功:
mv ./*/__test__/index.js ./*/data.js
.
├── alpha
│ ├── __test__
│ │ └── index.js
│ ├── index.js
│ └── test.js
└── beta
├── __test__
│ └── index.js
├── index.js
└── test.js
对此:
.
├── alpha
│ ├── data.js
│ ├── index.js
│ └── test.js
└── beta
├── data.js
├── index.js
└── test.js
我怎样才能在unix中做到这一点?
答案1
您不能在目标参数中使用通配符。所以至少需要一些脚本:
for d in *; do
if [[ -d "$d" ]]; then
pushd "$d"
mv __test__/index.js ./data.js
popd
fi
done
答案2
这是一个移动文件的示例。
for f in $(find -name index.js | grep __test__ ); do echo $f; destination=$(echo $f | awk 'BEGIN{FS="/"} {print $2}'); mv ${f} ./$destination/data.js; done
我已经对此进行了测试,它确实按预期执行了移动。
答案3
find . -path '*/__test__/*' -type f -name "index.js" \
-execdir echo mv -vt ../data.js {} \;
删除echo
用于空运行以mv
在文件上运行命令的内容。
答案4
删除echo
s 才能真正改变。
for i in */__test__/index.js; do
echo mv -v "$i" "${i%%/*}/data.js"
echo rm -vr "${i%/*}"
done
前
.
├── alpha
│ ├── index.js
│ ├── __test__
│ │ └── index.js
│ └── test.js
└── beta
├── index.js
├── __test__
│ └── index.js
└── test.js
后
.
├── alpha
│ ├── data.js
│ ├── index.js
│ └── test.js
└── beta
├── data.js
├── index.js
└── test.js