сценарий очистки для рекурсивной замены строки во всех каталогах и именах файлов [дубликат]

Потому что:

apt-cache policy teamviewer

показал:

 teamviewer: i386: 
Установлено: (нет) 
Кандидат: (нет) 
Таблица версий: 
 *** 12.0.71510 0 100 
 / var / lib / dpkg / status 
 

Установка не удалась. Просто констатирую тот факт, что он был частично установлен.


Очевидно, была недостающая зависимость:

libjpeg62:i386

Что было исправлено перезагрузкой и:

sudo apt-get install -f

Итак, отсутствующая зависимость теперь на месте, никаких дальнейших действий не требуется. И теперь TeamViewer будет работать нормально.

1
25.07.2016, 21:04
2 ответа

Для потенциально сложных и потенциально опасных вещей, подобных этой, мне нравится создавать сценарий, который делает то, что я хочу.

$ find foo_project -print > /tmp/list
$ vi /tmp/list
:%s/.*/'&'/            # quote all filenames just to be safe
:%s/.*/mv & &/         # generate mv commands
:%s/' '/'\r'/          # break them for the next step
:v/^mv /s/foo/bar/g    # modify the second arguments
:g/^mv /j              # re-join the lines

Теперь уделите немного времени изучению сценария, который вы только что создали, чтобы убедиться, что он будет делать то, что вы хотите:

mv 'foo_project/my_app/old_foo/start_foo.sh' 'bar_project/my_app/old_bar/start_bar.sh'
...

Если вам это нравится:

:wq
$ sh /tmp/list

Это общая техника, которую я использую все время. Точный способ редактирования сценария зависит от того, чего вы хотите достичь. Это не сексуальная шутка, но это безопасно.

Итак, если это то, что вы хотите делать на регулярной основе, а не разовое, то эта техника, вероятно, не то, что вам нужно. Но для одноразовой операции, когда вы вроде как нащупываете свой путь, это отлично работает.

Теперь, если вам нужно решение для многократного использования, пора написать сценарий:

#!/bin/sh
find foo_project -print | while read filename; do
  newname=`echo $filename | sed -e 's/foo/bar/g'`
  echo "renaming $filename => $newname"
  mv "$filename" "$newname"
done
0
27.01.2020, 23:47

Если вы используете CentOS или другую систему без rename (иногда известную как prename), то предложенный дубликат - хорошее место для поиска. Если вы работаете на системе, производной от Debian, то это может вам подойти:

find "$PROJECT_DIR" -depth -type d -execdir echo rename 's/foo/bar/' {} +

Это спускается по дереву каталогов сначала в глубину и переименовывает все элементы в каждом каталоге, изменяя foo на bar в каждом случае.

(На самом деле, он ничего не делает, кроме как показывает, что он будет делать. Удалите echo, когда будете довольны...)

1
27.01.2020, 23:47

Теги

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