Как рекурсивно переименовывать файлы в последовательном порядке?

Когда вы архивируете файл, добавьте его имя к файлу, который я назову archived_files.txt . Затем используйте - exclude-from = archived_files.txt в своей команде rsync , чтобы пропустить эти файлы.

0
19.03.2018, 08:09
2 ответа
  1. Узнайте, как опция globstarв bashможет вам помочь:

    shopt -s globstar ; for i in ** ; do echo "$i" ; done
    

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

  2. Отфильтровать подкаталоги:

    shopt -s globstar ; for i in ** ; do [ -f " $i" ] && echo "$i" ; done
    
  3. Ввести счетчик и удалить суффиксы текущего файла:

    cnt=1
    shopt -s globstar
    for i in ** ; do
      [ -f "$i" ] && echo "${i%%.*}.$cnt"
      cnt=$((cnt=cnt+1))
    done
    
  4. Замените оператор теста echoна mvпо вашему выбору:

    mv "$i" "${i%%.*}.$cnt"
    
  5. При необходимости отключите параметр globstarпосле завершения:

    `shopt +s globstar`
    
2
28.01.2020, 02:23

Сzsh:

проще
autoload zmv # best in ~/.zshrc
cd "Folder 1"
n=0; zmv -n '**/Item.<->(#qn^/)' 'Item ${(l:2::0:)$((++n))}'

(снять-n(для пробной работы -запустить )при хорошем состоянии ).

  • <->:любая последовательность десятичных цифр(<x-y>без границы)
  • (#qn):для числовой сортировки (поэтому Subfolder 10идет послеSubfolder 2).
  • ^/:исключить файлы типа каталог .
  • ${(l:2::0:)var}:левая -закладка (и обрезать, если больше)$varс 0s до длины 2.

Предупреждение :в то время как глобус **/предназначен для соответствия любому уровню подкаталога, включая пустой уровень, поэтому файлы в текущем каталоге соответствуют, в zmvэто не так из-за двойного передайте это с шаблоном, один раз для подстановки, а второй раз как простое сопоставление с шаблоном для извлечения групп захвата (, а затем тот второй **/Item, когда шаблон -совпал из-за отсутствия/).

Обходной путь заключается в использовании:

zmv -n '(**/)Item.<->(#qn^/)' 'Item ${(l:2::0:)$((++n))}'

или:

zmv -wn '**/Item.<->(#qn^/)' 'Item ${(l:2::0:)$((++n))}'

, но затем zmvобнаруживает рекурсивное совпадение и включает глубину -первого порядка (, чтобы можно было безопасно переименовывать каталоги ). Если вам не нужны файлы первого порядка и соответствия depth -в текущем каталоге,вы можете использовать полную форму**/((*/)#):

zmv -n '(*/)#Item.<->(#qn^/)' 'Item ${(l:2::0:)$((++n))}'

Пример

Включено:

.
├── Subfolder 1
│   ├── Item.01
│   ├── Item.02
│   └── Subsubfolder
│       └── Item.01
├── Subfolder 10
│   ├── Item.01
│   └── Item.02
└── Subfolder 2
    ├── Item.01
    └── Item.02

Дает:

mv -- Subfolder\ 1/Item.01 Item\ 01
mv -- Subfolder\ 1/Item.02 Item\ 02
mv -- Subfolder\ 1/Subsubfolder/Item.01 Item\ 03
mv -- Subfolder\ 2/Item.01 Item\ 04
mv -- Subfolder\ 2/Item.02 Item\ 05
mv -- Subfolder\ 10/Item.01 Item\ 06
mv -- Subfolder\ 10/Item.02 Item\ 07
1
28.01.2020, 02:23

Теги

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