Я придумал это, но, к сожалению, это не влияет на файлы / папки в подпапках.
find . -exec rename "s/^\s+//" {} \;
Структура папок:
foo
|-- \ bar
`-- \ foo1
|-- \ bar1
`-- \ foo2
`-- \ bar2
Проблема - то, что необходимо переименовать каталоги от нижней части до вершины. Еще команда попытается переименовать файлы и каталоги, которые внутри уже являются перемещенными (переименованными) папками и таким образом не могут больше находить их.
Это то, где 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
Как отмечено в других ответах, основной вопрос то, что ^
привязки запуск путь , а не запуск имени файла. Существует несколько способов работать вокруг этого с 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
, после того как Вы уверены, что это делает то, что Вы хотите]
Я думаю, что проблема с выходным форматом находки, которая включает полный путь. Таким образом для 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)"
MODESET
(см. devtalk.nvidia.com/default/topic/925605/linux/… ). Однако статье 1,5 лет поэтому, возможно, поддержки Уэйленда теперь EGLStreams и больше не требует НАБОРА РЕЖИМОВ на картах Nvidia. Так или иначе, благодарит указать, что это - работы для Вас без параметра ядра. Я должен буду попробовать его снова скоро. – Huygens 15 November 2017 в 21:42