我在 300 个不同的目录下有如此多的文件,文件树如下:
--s1
- ----abc
- ----bcd
--s2
- ----123
- ----234
... ETC。
我想把它们放在同一个目录下,例如:
--whole
- ----abc
- ----bcd
- ----123
- ----234 ...
有没有什么实用的 bash 脚本?
我编写了这段 Bash 脚本:
mkdir wavs
for ((i=1;i<=9;i++)); do
cd ~/wav/train/S000$i
mv * ~/wav/train/wavs
cd .. done
for ((i=10;i<=99;i++)); do
cd ~/wav/train/S00$i
mv * ~/wav/train/wavs
cd .. done
for ((i=100;i<=917;i++)); do
cd ~/wav/train/S0$i
mv * ~/wav/train/wavs
cd .. done
echo "ok"
但我收到了我不明白的错误:
./untar.sh: line 24: cd: /wav/train/S0917: No such file or directory
cp: target '/wav/train/wavs/' is not a directory ok
答案1
也许完成这项工作最简单的方法是通过命令find
(默认情况下它以递归方式工作):
find ~/wav/train/S* -type f -name "*.wav" -exec echo mv {} ~/wav/train/wavs/ \;
~/wav/train/S*
是搜索路径,它将匹配以 开头的每个子目录S
。-type f
将限制搜索范围仅限于文件。-name "*.wav"
将限制搜索以 结尾的文件.wav
。不是强制性的。-exec ... \;
将执行提及每次搜索巧合时都命令一次。{}
是包含巧合项的变量。echo
从命令中删除echo mv {} ~/wav/train/wavs/
要执行的操作。
此外,如果您想删除目录,您可以使用以下命令之一:
find ~/wav/train/S* -type d -name "S*" -exec echo rm -r {} \;
find ~/wav/train/S* -type d -name "S*" -delete