如何将多个目录下的文件移动到同一目录下?

如何将多个目录下的文件移动到同一目录下?

我在 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

相关内容