Переименуйте несколько каталогов с помощью переименования команда, имя включает скобки

Используйте это:

vishex () 
{ 
    [ -e "$1" ] || echo -e '#!/bin/bash\n\n' > "$1";
    chmod +x "$1";
    vi "+normal G" +startinsert "$1"
}
  • [ -e "$1" ] проверяет, существует ли уже скрипт. Если да, то echo не отменит его.
  • -e в echo позволяет интерпретировать обратные косые черты, например \n для новой строки. Затем он вставляет 2 новые строки после строки shebang.
  • +normal G запускает команду ex G, которая переходит к последней строке в файле.
  • +startinsert переключает непосредственно в режим вставки (можно и оставить, так как в вопросе это не упоминается).

Итак, при выполнении vishex script это выглядит так:

#!/bin/bash

<- cursor is here
~
[...]
~
-- INSERT --                                                               3,1           All
0
15.06.2018, 16:55
3 ответа

\ es un operador de comillas en la sintaxis de shell por lo que:

rename s/\(Done\)//g *

Es lo mismo que correr:

rename 's/(Done)//g' *

Y (, )son ​​caracteres especiales en la sintaxis de expresiones regulares de perl (que renameusa )y deben tener el prefijo\(o cambiarse a [(]y[)])por lo que son tratados literalmente.

Así que aquí, quieres:

rename 's/\s*\(Done\)//g'./*

Aquí también se agrega \s*para eliminar cualquier espacio en blanco antes de (Done), y un prefijo ./ya que algunas variantes de renameahogarían los nombres de archivo que comienzan con -.

2
28.01.2020, 02:31

Usandofind:

find topdir -maxdepth 1 -type d -name '* (Done)' -exec sh -c '
    for pathname do
        mv "$pathname" "${pathname%" (Done)"}"
    done' sh {} +

Esto usa findpara seleccionar los directorios que tienen ␣(Done)al final de sus nombres y luego usa una sustitución de parámetro estándar para eliminar esa cadena.

No se realiza ninguna verificación para asegurarse de que no haya un directorio/archivo con el nombre de destino en el mismo directorio.


La secuencia de comandos sh -canterior obviamente también podría ejecutarse por sí misma,con modificaciones menores para hacer las pruebas que findhizo para él:

for pathname in topdir/*' (Done)'/; do
    mv "$pathname" "${pathname%' (Done)/'}"
done
0
28.01.2020, 02:31

Это должно работать:

rename 's/\(.*\)|\[.*\]//g' *

В противном случае без использования команды rename(OT):

for file in folder*; do                                                          
    mv "$file" "${file/\(Done\)/}"
done
0
28.01.2020, 02:31

Теги

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