Как можно, кроме скрытого '.' файлы и каталоги из скрипта, который их переименовывает?

Когда я столкнулся с ошибкой, я запустил сценарий с помощью sudo, поскольку от него зависели другие части сценария. Как ни странно, он отлично работает, если я запускаю часть proxychains без sudo... Думаю, я как-то испортил права пользователя.

3
11.09.2020, 11:48
1 ответ

Просто используйте zshсzmv:

#! /bin/zsh -
autoload -Uz zmv
zmv '(**/)(* *)' '$1${2// /_}'
  • zmvпо умолчанию пропускает скрытые файлы и файлы в скрытых каталогах (, если вы не передадите квалификатор (#qD)в первый аргумент ),
  • он обрабатывает файлы сначала в глубину(ваш sort -rzне гарантирует работу для этого и -pruneне совместим с-depth)
  • нам не нужно вызывать dirname/ basename(, что было бы дорого и не работало бы должным образом с подстановкой команд, если есть некоторые имена файлов, заканчивающиеся символами новой строки ).
  • у него нет findпроблем, из-за которых *не совпадают произвольные последовательности байтов.
  • Если есть некоторые конфликты (, например, когда есть файлы a b cи a_b c, которые оба будут переименованы в a_b_c), он обнаружит это в начале и прервется, прежде чем выполнять какое-либо переименование.

Чтобы сделать что-то похожее с инструментами GNU, это будет что-то вроде:

#! /bin/bash -
export LC_ALL=C
while IFS= read <&3 -rd '' file; do
  dir=${file%/*} name=${file##*/}
  mv -i -- "$file" "$dir/${name// /_}"
done 3< <(
  find. -name '.?*' -prune -o -name '* *' -print0 |
    tac -s '')

Вот,

  • установка локали на C, чтобы *соответствовала любой последовательности байтов, а не только тем, которые образуют допустимые символы в локали пользователя. Имейте в виду, однако, что сообщения (, ошибки, подсказки... )будут выдаваться на английском, а не на языке пользователя.
  • Переход с -iна mvдля защиты от непреднамеренного затирания файлов.
  • Передача списка файлов через fd 3 вместо стандартного ввода, поэтому приглашение mv -iработает.
  • Использование tac -s ''вместо sort -rzдля реверсирования вывода, чтобы обеспечить переименование листьев перед ветвями, на которых они находятся.
  • замена dirname/ basenameстандартными операторами раскрытия параметров ${var##pattern}и ${var%pattern}.
  • также передает -rв read, чтобы отключить специальную обработку обратной косой черты.
  • убедившись, что дляread$IFSпусто, поэтому он не удаляет конечные пробелы из входных записей.
3
18.03.2021, 23:05

Теги

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