Удалить начальные пробелы из файлов, папок и их подпапок

Я придумал это, но, к сожалению, это не влияет на файлы / папки в подпапках.

find . -exec rename "s/^\s+//" {} \;

Структура папок:

foo
|-- \ bar
`-- \ foo1
    |-- \ bar1
    `-- \ foo2
        `-- \ bar2
4
задан 12 May 2016 в 12:44

3 ответа

Переименование потребностей, которые будут сделаны от нижней части до вершины

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

Это то, где python os.walk() может использоваться, в сочетании с topdown=False

В маленьком сценарии:

#!/usr/bin/env python3
import os
import shutil
import sys

for root, dirs, files in os.walk(sys.argv[1], topdown=False):
    for f in files:
        if f.startswith(" "):
            shutil.move(root+"/"+f, root+"/"+f.strip())
    for dr in dirs:
        if dr.startswith(" "):
            shutil.move(root+"/"+dr, root+"/"+dr.strip())

Использовать

  • Скопируйте сценарий в пустой файл, сохраните его как no_space.py
  • Выполните его командой:

    python3 /path/to/no_space.py /path/to/directory/to/rename
    
3
ответ дан 12 May 2016 в 22:44
  • 1
    Странный @BerenddeBoer, у меня есть GeForce GT710, и без драйвера начальной загрузки Ядра он не работал, как я вспоминаю. Существует также эта статья, которая показывает, что для Уэйленда необходимо установить MODESET (см. devtalk.nvidia.com/default/topic/925605/linux/… ). Однако статье 1,5 лет поэтому, возможно, поддержки Уэйленда теперь EGLStreams и больше не требует НАБОРА РЕЖИМОВ на картах Nvidia. Так или иначе, благодарит указать, что это - работы для Вас без параметра ядра. Я должен буду попробовать его снова скоро. – Huygens 15 November 2017 в 21:42

Как отмечено в других ответах, основной вопрос то, что ^ привязки запуск путь , а не запуск имени файла. Существует несколько способов работать вокруг этого с find и rename: вероятно, самое безопасное должно было бы использовать -execdir вместо -exec так, чтобы все компоненты контура уменьшили до ./ и затем заменили шаблон \./\s+

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

Соединение его,

find . -depth -name ' *' -execdir rename -vn -- 's#\./\s+##' {} +

или (функционально эквивалентный, но немного легче видеть, что происходит), использование нулевой длины "lookbehind" для разделителя

$ find . -depth -name ' *' -execdir rename -vn -- 's#(?<=\./)\s+##' {} +
./ bar2 renamed as ./bar2
./ foo2 renamed as ./foo2
./ bar1 renamed as ./bar1
./ foo1 renamed as ./foo1
./ bar renamed as ./bar

пути [ПРИМЕЧАНИЕ: удалите -n, после того как Вы уверены, что это делает то, что Вы хотите]

2
ответ дан 12 May 2016 в 22:44
  • 1
    Я мог также добраться, это для запуска lightdm (dpkg-реконфигурируйте lightdm), а не gdm3, но входящий в систему с lightdm doesn' t работа. – Roland Quast 25 October 2017 в 20:22

Я думаю, что проблема с выходным форматом находки, которая включает полный путь. Таким образом для bar2 Вы будете иметь

./ foo1/ foo2 /bar2

это переименовывает, не поймет правильно.

Решение состоит в том, чтобы использовать сценарий, чтобы сделать каждую папку рекурсивно как это:

#!/bin/bash
# if argument given consider it is the directory to parse
if [ -n "$1" ]; then
    cd "$1"
fi
# rename all files in current folder
find . -maxdepth 1 -printf '%f\0'  | xargs -0r -n 1 rename -nono 's/^\s+//'
# No, repeat for all subfolders with current script (we are in the subfolder)
find . -maxdepth 1 -type d -not -name '.' -print0 | xargs -0r -n 1 "$(readlink -f $0)"
1
ответ дан 12 May 2016 в 22:44
  • 1
    Возможно, обеспечьте шаги, чтобы сделать, когда Вы входите через режим восстановления, значительно улучшил бы качество Вашего ответа. – Videonauth 25 October 2017 в 20:34

Другие вопросы по тегам:

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