Переименовать файл между двумя точками

Наличие нескольких версий библиотеки в системе не является проблемой для большинства дистрибутивов Linux: совместно используемые библиотеки с разными именами могут сосуществовать внутри тот же каталог / usr / lib . Более того, менеджеры пакетов могут быть проинструктированы установить несколько таких библиотек, указав правильные имена пакетов:

apt-get install libjpeg7
apt-get install libjpeg8

В действительности вы можете столкнуться с двумя недостатками в этой системе:

  1. Большинство дистрибутивов предоставляют только одну версию библиотеки для каждой версии дистрибутива для экономии места. Например, мой Debian Wheezy имеет только libjpeg8 . Вы по-прежнему сможете установить определенную версию библиотеки (например, libjpeg7 ) из исходных текстов, и она будет без проблем сосуществовать с другими версиями. Вы даже можете попытаться установить пакет из другого дистрибутива, но будьте осторожны, так как это может вызвать множество зависимостей.

  2. Иногда две версии библиотеки с одним и тем же soname (которые должны быть совместимы) работают с одними программами, но не с другими. Это, кстати, основная причина иметь несколько версий дистрибутивов. В этом случае решение состоит в том, чтобы хранить несовместимые библиотеки вне / usr / lib и сделать их доступными для конкретной программы через LD_LIBRARY_PATH или chroot.

0
09.02.2018, 10:55
2 ответа

Hay un montón de preguntas en este sitio sobre el cambio de nombre de los archivos usando bucles de shell como ese, y un par sobre el uso de sedpara eso. (por ej. esto , esto)

Deberá pasar el nombre del archivo a sedcon una canalización y usar la sustitución de comandos para capturar el resultado, así que algo como esto:

mv "$f" "$(echo "$f" | sed -e '...' )"

El comando sedque usó necesita un poco de corrección :Por un lado, ha citado los paréntesis de apertura pero no los de cierre, por lo que la agrupación no funcionará. Además, no estoy seguro de por qué le gustaría volver a colocar los fragmentos LabelMeen el nombre del archivo. Si desea eliminarlos, simplemente omita la agrupación y las referencias \N:

's/--LabelMe.*LabelMe--//'

Así que en su totalidad:

for f in "$@"
do 
    mv "$f" "$(echo "$f" | sed -e 's/--LabelMe.*LabelMe--//' )"
done

Otra forma sería usar la sustitución de parámetros del shell para hacer lo mismo. La sustitución ${par/pattern/replacement}no es estándar, pero es compatible con muchos shells:

for f in "$@"
do 
    mv "$f" "${f/--LabelMe*LabelMe--/}"
done

(tenga en cuenta que no es una expresión regular, por lo que la sintaxis de "cualquier cosa" es solo *, y no.*)

0
28.01.2020, 02:44

Use (perl )renombrar. No sé acerca de Apple, pero las distribuciones de Linux en su mayoría se envían con dos versiones de cambio de nombre. El cambio de nombre de Perl es el más potente.

En primer lugar, ejecute el comando con el indicador -n, que realiza una "ejecución en seco -" y no realiza cambios.

$ rename 's/(.{6}).*LabelMe--/$1/' 000* -n
0001--LabelMe--A005_01241110_C001--LabelMe-- --Interview--Man in library.mov -> 1110_C --Interview--Man in library.mov
0002--LabelMe--A005_01241110_C002--LabelMe-- --Broll--Man looking at books.mov -> 1110_C --Broll--Man looking at books.mov
0003--LabelMe--A005_01241111_C003--LabelMe-- --Broll--messed up--LabelMe-- --Broll--Sitting at table.mov -> messed --Broll--Sitting at table.mov

Una vez que esté satisfecho con el resultado, ejecútelo de verdad, es decir,rename 's/(.{6}).*LabelMe--/$1/' 000*

Explicación

  • rename 's/foo/bar/' 000*:Este formato buscará la expresión regular fooy la reemplazará con bar. Funcionará en todos los archivos que coincidan con el glob 000*.
  • (.{6}).*LabelMe--:Esta es la expresión regular que está buscando. Estás buscando seis de cualquier carácter .{6}, que pones en un grupo de captura (.{6}). Después de esto, puede tener cualquier carácter .*, antes de encontrar LabelMe--.
  • $1:Esto es con lo que reemplazará la cadena anterior.$1se refiere al contenido del grupo de coincidencia (.{6})anterior. El resto no se reemplazará, es decir, se elimina todo después de los primeros seis caracteres hasta LabelMe--inclusive.
1
28.01.2020, 02:44

Теги

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