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

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

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?
  • Обнаруживать, если переменная пуста
  • Как переместить подкаталоги в другой подкаталог в одном каталоге?
  • Как перемещать файл без сохранения разрешений
  • Не может mv в подкаталог себя
  • Переместить папки, не существующие в целевой каталог
  • Ошибка mv command "уже существующий файл"
  • Я случайно переместил каталог в «..». Куда он пошел?
  • 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 - лучшая ОС в мире.