Перемещение файлов в родительский каталог с префиксом имени файла к имени бывшего подкаталога [duplicate]

На этот вопрос уже есть ответ здесь:

У меня есть папка 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.

Как мне проще всего выполнить эту операцию массового перемещения/переименования огромного каталога?

3
задан 14 January 2017 в 19:19

1 ответ

В 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
5
ответ дан 1 December 2019 в 15:34

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

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