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

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

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

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

  • Изменение действия Open Open Folder Folder Folder
  • Мониторинг процесса в Debian
  • Как воспроизводятся Flash-видео?
  • Игнорировать глобусы, которые не соответствуют чему-либо
  • Почему прикосновение создает новые файлы?
  • Почему временные метки на старых файлах установлены на моей недавно установленной системе?
    • все файлы, начиная с 20 в папке с именем 20, и все файлы, начиная с 10 в папке с именем 10. Тип файла не имеет значения.

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

  • Тар список файлов, которые не все существуют
  • Какую оболочку по умолчанию использовать для пользователя SSH, ограниченного одной командой
  • Извлечение содержимого архива tar в родительский каталог, что приводит к созданию подкаталогов
  • Почему некоторые изменения файлов не отображаются в хвосте -f?
  • Проверьте, открыт ли файл другим процессом
  • Selinux запрещает доступ к mysqld
  • 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 - лучшая ОС в мире.