На этот вопрос уже есть ответ здесь:
У меня есть папка parentdir
со многими каталогами, такими как этот:
$ tree parentdir/subdir_1
parentdir/subdir_1
├── important.txt
├── important_001.txt
├── important_002.log
├── important_007.bmp
├── something
├── else.mp3
├── nothing.000
└── ignore.me
Что я хочу, так это переместить все файлы с именем, начинающимся с important
в родительский каталог parentdir
и переименовать их, префиксируя каждое имя файла с именем подкаталога, из которого они пришли.
Например, parentdir/subdir_1/important_001.txt
должен быть перемещен/переименован в parentdir/subdir_1-important_001.txt
.
Как мне проще всего выполнить эту операцию массового перемещения/переименования огромного каталога?
В parentdir
Вы могли использовать
for f in ./*/important*; do rename -n 's#\./([^/]+)/(.*)#$1-$2#' "$f" ; done
Удалить -n
после тестирования, чтобы на самом деле переместиться и переименовать
s#old#new#
замена old
с new
\./([^/]+)/(.*)
литерал соответствия ./
затем сохраните некоторые символы кроме /
, затем соответствие /
, затем сохраните остальных$1-$2
два сохраненных шаблона, разделенные -
Отказ от разделителя пути перемещает файлы в parentdir
силой
Запоздалая мысль: проще в этом случае Вы могли просто использовать s#/#-#
заменять /
с -
, исключение ./
от запуска
for f in */important*; do rename -n 's#/#-#' "$f" ; done