1

Пример структуры папок:

➜  test tree
.
├── testflac1
│   ├── track1.flac
│   ├── track2.flac
│   └── track3.flac
├── testflac2
│   ├── track1.flac
│   ├── track2.flac
│   └── track3.flac
├── testflac3
│   ├── track1.flac
│   ├── track2.flac
│   └── track3.flac
├── testmp31
│   ├── track1.mp3
│   ├── track2.mp3
│   └── track3.mp3
├── testmp32
│   ├── track1.mp3
│   ├── track2.mp3
│   └── track3.mp3
└── testmp33
    ├── track1.mp3
    ├── track2.mp3
    └── track3.mp3

И целью было бы переместить папки с одним расширением в один каталог, например ~/test [FLAC] и другие, содержащие расширение mp3 в ~/test [MP3] . Я попытался сделать это с помощью find , но это позволило мне самим перемещать файлы, не сохраняя структуру папок.

1 ответ1

1

Пытаться:

shopt -s nullglob; for dir in path/to/*/; do files=("$dir"/*{mp3,flac}); [ "${files[0]}" ] && mv "$dir" ~/test; done

Или для тех, кто предпочитает, чтобы их команды распределялись по нескольким строкам:

shopt -s nullglob
for dir in path/to/*/
do
    files=("$dir"/*{mp3,flac})
    [ "${files[0]}" ] && mv "$dir" ~/test
done

Перед выполнением этого, конечно, измените path/to/ на что угодно, что приведет вас к вашему тестовому каталогу, как показано в вопросе. Затем path/to/*/ должен быть расширен до всех каталогов, представляющих интерес.

Как это устроено

  • shopt -s nullglob

    Это устанавливает nullglob так, чтобы расширение пути, которое не возвращало файлов, возвращало пустую строку.

  • for dir in path/to/*/; do

    Это запускает цикл по всем каталогам в вашем тестовом каталоге.

  • files=("$dir"/*{mp3,flac})

    Это создает массив, элементами которого являются любые имена файлов в $dir , оканчивающиеся на mp3 или flac .

  • [ "${files[0]}" ] && mv "$dir" ~/test

    Если files массивов не пусты (имеется в виду, что в каталоге есть хотя бы один файл mp3 или flac), переместите каталог dir в ~/test .

  • done

    Это сигнализирует об окончании цикла.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .