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

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

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, ... 

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

  • Переопределение исправленных временных меток
  • Как создать относительную символическую ссылку, совместимую с POSIX, в / bin / sh?
  • удалите первую строку файла, только если пустой с помощью sed
  • Как я могу повернуть поведение gedit something & disown` в поведение по умолчанию при вызове gedit из командной строки?
  • Доступ к выделенному тексту из сценария?
  • Метафора для концепции оболочки?
    • все файлы, начиная с 20 в папке с именем 20, и все файлы, начиная с 10 в папке с именем 10. Тип файла не имеет значения.

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

  • Где хранятся переменные оболочки?
  • set -u использование не работает как ожидалось
  • Итерация по наборам аргументов команды в Bash
  • Скопировать файлы в новый каталог, только если имя файла находится в массиве
  • Сценарий Bash не может перемещать файлы
  • Возможно ли создать «файл», который может быть использован любым процессом без фактического сохранения файла на диске?
  • 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 - лучшая ОС в мире.