групповые файлы в папках по именам

У меня есть папка со многими файлами вроде:

20_1_A.xml, 20_2_A.xml, 20_3_A.xml, ... 10_1_A.xml, 10_2_A.xml, 10_3_A.xml, ... 20_1_A.csv, 20_2_A.csv, 20_3_A.csv, ... 10_1_A.csv, 10_1_A.csv, 10_3_A.csv, ... 

Я хочу сгруппировать файлы по первому номеру в имени с помощью команд оболочки. Например:

  • все файлы, начиная с 20 в папке с именем 20, и все файлы, начиная с 10 в папке с именем 10. Тип файла не имеет значения.

Кто-нибудь знает, как это сделать? Я думал об использовании подстановочных знаков, но я не знаю, как …

  • Почему MV (1) копирует объекты, если разрешение на перенос отклонено?
  • перемещать файлы определенного шаблона в другой каталог
  • Как вы можете перемещать файл в качестве фонового задания и удалять все остальные файлы и каталог перед ожиданием завершения задания?
  • Атомное удаление каталога
  • Каталог ssh исчезает после `mv ssh .ssh`
  • Как переименовать несколько файлов, добавив общую строку в начале файлов?
  • Почему не работает эта команда sudo mv с шаблоном?
  • Помогла ли моя команда $ mv '* .mobi' соединить мои файлы?
  • 3 Solutions collect form web for “групповые файлы в папках по именам”

    Подстановочные знаки – правильный инструмент. Вы можете переместить все файлы следующим образом:

     for i in {10,20} # or something like $(seq 10 10 90) instead of {10,20} if you have a lot of different prefixes do mkdir -p "$i" && mv "$i"* "$i"/ done 

    Вы хотите mkdir -p чтобы mkdir не жаловался, если целевой каталог уже существует.

     for datei in *_*.xml *_*.csv; do mkdir -p -- "${datei%%_*}" && mv -- "$datei" "${datei%%_*}" done 

    Для каждого файла, соответствующего шаблонам, создайте dir, названный частью перед первым подчеркиванием (если он еще не существует, -p ) и переместите туда файл.

    Надеюсь, это подходит.

    С zsh :

     mkdir_and_move() {mkdir -p -- $2:h && mv -- "$@"} autoload zmv zmv -P mkdir_and_move '(<->)*.(csv|xml)(#q.)' '$1/$f' 

    <-> – это glob, который соответствует любому десятичному целому числу ( <xy> – целые числа от x до y ). (#q.) является квалификатором glob, который выбирает только обычные файлы.

    Подобно тому, что вы делаете с циклом, за исключением того, что zmv добавляет несколько проверок здравомыслия.

    Linux и Unix - лучшая ОС в мире.