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

Существует возможность скопировать метку времени из другого файла.

touch -m -r file_source file_target

Пример:

[oracle@es abc]$ ls -tlr
total 4
-rw-r--r--. 1 oracle oinstall 102 May  8 20:35 aa.txt
[oracle@es abc]$ echo "hi hi" > b
[oracle@es abc]$ ls -ltr
total 4
-rw-r--r--. 1 oracle oinstall 102 May  8 20:35 aa.txt
-rw-r--r--. 1 oracle oinstall   6 May 13 18:58 b
[oracle@es abc]$ touch -m -r aa.txt b
[oracle@es abc]$ ls -tlr
total 8
-rw-r--r--. 1 oracle oinstall   6 May  8 20:35 b
-rw-r--r--. 1 oracle oinstall 102 May  8 20:35 aa.txt
[oracle@es abc]$ cat b
hi hi
0
01.07.2021, 17:26
3 ответа

Для полноты картины, а также благодаря простой структуре имен ваших файлов и целевых каталогов следующая команда findперебирает все файлы глав и перемещает их в целевой каталог, имя которого происходит от имени файла:

find. -maxdepth 1 -type f -name 'chapter*_section*.odf' -exec bash -c 'f={}; d="book/${f%_*}"; mv "$f" "$d"' \;

Это будет (неявно )перебирать все файлы, соответствующие chapter*_section*.odf, и выполнять команду оболочки, которая извлекает имя целевого каталога, удаляя последний компонент _*из имени файла, эффективно оставляя только chapterNчасть. Затем он переместит обрабатываемый файл в соответствующий подкаталог в book/.

Примечание

  • Параметр -maxdepth 1необходим для обеспечения того, чтобы операция выполнялась только над файлами в текущем каталоге, а не рекурсивно над теми, которые уже были перемещены в свои целевые каталоги после обработки текущего каталога.
  • Встраивание {}в команду оболочки, вызываемую через -exec, не рекомендуется , но будет работать, если вы не предполагаете попыток внедрения вредоносного кода.
0
28.07.2021, 11:21

Без использования цикла for? Вы можете использовать утилиту perl rename(, также известную как prename, file-renameили perl-renameв некоторых дистрибутивах ), чтобы создать подкаталоги и переименовать в них файлы. Например:

$ rename -v 'BEGIN{mkdir "book"};
             if (m/chapter(\d+)/) {
               my $d="book/chapter$1";
               mkdir $d;
               $_ = "$d/$_"
             }' *
chapter1.txt renamed as book/chapter1/chapter1.txt
chapter2.txt renamed as book/chapter2/chapter2.txt
chapter3.txt renamed as book/chapter3/chapter3.txt
chapter4.txt renamed as book/chapter4/chapter4.txt
chapter5.txt renamed as book/chapter5/chapter5.txt

Резюме сценария на английском языке:

Если текущее имя файла($_)соответствует регулярному выражению chapter(\d+), извлеките номер главы из имени файла (, т.е. $1, которое является первой и единственной группой захвата в регулярном выражении, (\d+)), создайте каталог для главы, а затем переименуйте текущий файл в каталог.

Не соответствующие -имена файлов игнорируются.

perl renameпытается переименовать файл только в том случае, если скрипт переименования изменяет значение $_. Он также отказывается перезаписывать существующий файл, если только вы не вынуждаете его с помощью опции -f.

perl rename позволяет вам использовать любой код perl в сценарии переименования (, но обратите внимание, что действует прагма use strict, поэтому вам нужно объявить свои переменные ). Если код изменится $_, файл будет переименован. Если нет, то не будет.

Обратите внимание, что хорошей практикой является выполнение сначала пробного -запуска с опцией -n, чтобы убедиться, что переименование будет делать то, что вы хотите, (восстановление после неудачного массового переименования может быть серьезной проблемой. ПИТА ). -nне переименовывает никакие файлы, он просто показывает, что он сделал бы . Замените -nна -v(, как показано выше ), чтобы получить подробный вывод, или просто удалите -nдля бесшумной работы.

1
28.07.2021, 11:21

Я считаю утилиту mmvудобной для подобных вещей:

$ mmv -v 'chapter*_section*.odf' 'book/chapter#1/'
chapter1_section1.odf -> book/chapter1/chapter1_section1.odf : done
chapter1_section2.odf -> book/chapter1/chapter1_section2.odf : done
chapter1_section3.odf -> book/chapter1/chapter1_section3.odf : done
chapter1_section4.odf -> book/chapter1/chapter1_section4.odf : done
chapter2_section1.odf -> book/chapter2/chapter2_section1.odf : done
chapter2_section2.odf -> book/chapter2/chapter2_section2.odf : done
chapter2_section3.odf -> book/chapter2/chapter2_section3.odf : done
chapter2_section4.odf -> book/chapter2/chapter2_section4.odf : done

давать

$ tree book
book
├── chapter1
│   ├── chapter1_section1.odf
│   ├── chapter1_section2.odf
│   ├── chapter1_section3.odf
│   └── chapter1_section4.odf
└── chapter2
    ├── chapter2_section1.odf
    ├── chapter2_section2.odf
    ├── chapter2_section3.odf
    └── chapter2_section4.odf

2 directories, 8 files
1
28.07.2021, 11:21

Теги

Похожие вопросы