У меня есть эта структура папок:
├── foo1
│ ├── bar1.txt
│ └── bar2.txt
├── foo2
│ ├── bar3.txt
│ └── bar4 with a space.txt
└── foo3
└── qux1
├── bar5.txt
└── bar6.txt
что я хотел бы добавить к этому, с подчеркиванием между каждым уровнем папки:
├── foo1_bar1.txt
├── foo1_bar2.txt
├── foo2_bar3.txt
├── foo2_bar4 with a space.txt
├── foo3_qux1.bar6.txt
└── foo3_qux1_bar5.txt
Я осмотрелся и не нашел ни одного решения, которое бы работало, в основном, я думаю, потому что у моей проблемы есть две особенности: внутри корневого каталога может быть несколько уровней, а также потому, что в некоторых файлах могут быть пробелы.
Есть идеи, как этого добиться в bash? Спасибо!
Редактировать : Запуск Глин Джекман предложил ответ, я получаю это:
Есть два подчеркивания для папки первого уровня. Любая идея, как избежать этого или просто переименовать его, чтобы это было только одно подчеркивание? Спасибо.
источник
foo1__qux1_bar5.txt
, два подчеркивания на первом уровне папок. Пробовал возиться с вашей линией bash, но ничего не получалось. Может быть, мне нужно что-то добавить?"${file//\//_}"
на"${file//+(/)/_
, и если это сценарий,shopt -s extglob
brew install findutils
а затем с помощьюgfind
вместоfind
. Это сработало для меня.Использование переименования perl:
ВЫВОД
НОТА
(?<!\.)
чтобы не трогать первый./
Я держу пустые папки, не стесняйтесь:
find . -depth -type d -exec rm {} \;
Существуют другие инструменты с таким же именем, которые могут или не могут сделать это, поэтому будьте осторожны.
Если вы запустите следующую команду (
GNU
)и у вас есть результат, как
и не содержащий:
тогда это кажется правильным инструментом =)
Если нет, чтобы сделать его по умолчанию (обычно уже так)
Debian
и производной, какUbuntu
:(заменить
/path/to/rename
путь вашейperl's rename
команды.Если у вас нет этой команды, найдите менеджер пакетов, чтобы установить его или выполните вручную
Наконец, что не менее важно, этот инструмент был первоначально написан Ларри Уоллом, отцом Perl.
источник
-type d -exec rmdir
...?perl-rename
в Arch Linux иprename
в системах на основе Debian.rename
объясненияс
pax
...Это создаст жесткую ссылку в текущем каталоге на все файлы в его дочерних каталогах с
_
заменой на/
. Затем вы можете проверить результаты и удалить все дочерние каталоги с помощью ...... как только вы убедились, что результаты вам по вкусу.
источник
Вы можете попробовать с приведенной ниже командой.
Выше команда переместит файлы и каталог останется, который может быть удален позже.
источник