Como mover arquivos em multi-diretórios no mesmo diretório?

1

eu tenho tantos arquivos com menos de 300 diretórios diferentes, árvore de arquivos como:

--s1
 - ----abc
 - ----bcd
--s2
 - ----123
 - ----234

... etc.

Eu quero colocá-los juntos no mesmo diretório, como:

--whole
 - ----abc
 - ----bcd
 - ----123
 - ----234 ...

Existe algum script bash útil na prática?

Codifiquei este pedaço de script:

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"

mas recebi o erro que não entendo:

./untar.sh: line 24: cd: /wav/train/S0917: No such file or directory 
cp: target '/wav/train/wavs/' is not a directory ok
    
por David Aksnes 02.04.2018 / 10:56

1 resposta

1

Talvez a maneira mais simples de fazer esse trabalho seja pelo comando find (por padrão, ele funciona recursivamente):

find ~/wav/train/S* -type f -name "*.wav" -exec echo mv {} ~/wav/train/wavs/ \;
  • ~/wav/train/S* é o caminho de pesquisa e corresponderá a cada subdiretório que começa com S .

  • -type f limitará a pesquisa apenas aos arquivos.

  • -name "*.wav" limitará a pesquisa apenas aos arquivos que terminem com .wav . Não obrigatório.

  • -exec ... \; executará o comando mencionado uma vez para cada coincidência de pesquisa.

  • {} é uma variável que contém o item de coincidência.

  • remova echo do comando echo mv {} ~/wav/train/wavs/ para executar a ação.

Além disso, se você quiser excluir os diretórios, você pode usar um comando como um destes:

find ~/wav/train/S* -type d -name "S*" -exec echo rm -r {} \;
find ~/wav/train/S* -type d -name "S*" -delete
    
por pa4080 02.04.2018 / 11:50