Я хочу сделать сценарий для "раскрытия" всех файлов и каталогов в определенном каталоге сразу, например. ./unhide test
.
test/
├── sub1
│ └── .hiddenfile1
└── sub2
└── .hiddendir
├── .hiddendirsub
├── .hiddenfile2
└── not.hidden
Желаемый результат:
test/
├── sub1
│ └── hiddenfile1
└── sub2
└── hiddendir
├── hiddendirsub
├── hiddenfile2
└── not.hidden
Как я могу сделать это?
Я все еще плохо знаком с этим, и я пытался найти использование решения find
, но упорно продолженный -exec
, и rename
(или mv
) потому что я все еще изо всех сил пытаюсь понять, как эта комбинация работает.:( Так, я буду ценить, если кто-либо здесь может дать решение и подробное объяснение также.Спасибо.
Можно сделать это с find
следующим образом:
find /path/to/test -depth -name ".*" -execdir rename -n 's|/\.|/|' {} +
Это только печатает действия переименования, если это показывает то, что Вы хотите, удаляют -n
опция.
-depth
– позволяет find
процесс от нижней части до вершины, переименовывая файлы перед их родительскими каталогами-name ".*"
– позволяет find
поиск регистрирует (все - файл), начало с точки – точка является литеральной здесь, поскольку это не регулярное выражение-execdir … +
– выполниться …
в каталоге подобранного файлаrename 's|/\.|/|' {}
– замените первое вхождение “/”. от пути подобранного файла (find
заполнитель, для которого {}
) с “/”, по существу удаляя точку с начала имени файлаrename 's|/\.|/|' ./.hiddenfile1
в Вашем случае это было бы переименовано к ./hiddenfile1
.$ tree -a
.
├── sub1
│ └── .hiddenfile1
└── sub2
└── .hiddendir
├── .hiddendirsub
├── .hiddenfile2
└── not.hidden
$ find ~/test -depth -name ".*" -execdir rename 's|/\.|/|' {} +
$ tree -a
.
├── sub1
│ └── hiddenfile1
└── sub2
└── hiddendir
├── hiddendirsub
├── hiddenfile2
└── not.hidden
В сценарии можно просто использовать позиционные параметры вместо пути, это может быть относительно или абсолютно – просто не забывают заключать в кавычки правильно:
#!/bin/bash
find "$1" -depth -name ".*" -execdir rename -n 's|/\.|/|' {} +
$ tree -a test
test
├── .alsohidden
├── sub1
│ └── .hiddenfile1
└── sub2
├── .hiddendirsub
├── .hiddenfile2
└── not.hidden
3 directories, 4 files
$ find test/ -depth -name ".*" -exec rename -n 's|(.*/)\.(.*)|$1$2|' {} +
rename(test/.alsohidden, test/alsohidden)
rename(test/sub2/.hiddendirsub, test/sub2/hiddendirsub)
rename(test/sub2/.hiddenfile2, test/sub2/hiddenfile2)
rename(test/sub1/.hiddenfile1, test/sub1/hiddenfile1)
find test/
начните пути с test/
, ищите рекурсивно от этого пути-depth
украденный от ответа десерта - походил на хорошую идею-name ".*"
имя файла запускается с .
-exec command {} +
выполненный command
на найденных файлах, создавая список аргументов.rename -n
ничего не сделайте, только покажите то, что будет сделано (удалить -n
после тестирования для фактического переименования)s|old|new|
замена old
с new
(.*/)\.(.*)
сохраните все символы до и включая последний разделитель каталога/
, пропустите литерал .
, сохраните все последующие символы$1$2
распечатайте сохраненные шаблоны