Shell scripting: ¿Por qué solo el guión “-” arroja un error?

2

Objetivo: limpiar

Truncar selectivamente los nombres de archivo en mi carpeta de notas nvALT. Intenté usar la sugerencia de un blogger de productividad (que se me escapa después de una búsqueda exhaustiva) para agregar ^ > - + a los nombres de archivo, pero no me funciona. ¡Es hora de limpiar la casa! Sin embargo, debo asegurarme de no cortar ningún carácter alfa en los nombres de archivo que no usen esos prefijos. Además, estoy aprendiendo scripting y creo que es divertido!

Shell script

Esto es lo que tengo:

#!/bin/bash

cd ~/dropbox/notes_test

for f in *; do
  FILENAME=$(basename "$f")
  DIRNAME=$(dirname "$f")
  if [[ "$f" == \^\ * ]]; then
    mv "$f" "${DIRNAME}/${FILENAME:2}"
  fi
  if [[ "$f" == \+\ * ]]; then
    mv "$f" "${DIRNAME}/${FILENAME:2}"
  fi
  if [[ "$f" == \>\ * ]]; then
    mv "$f" "${DIRNAME}/${FILENAME:2}"
  fi
  if [[ "$f" == \-\ * ]]; then
    mv "$f" "${DIRNAME}/${FILENAME:2}"
  fi
done

Problema: el guión

Aquí está la entrada de línea de comando y el mensaje de error. Obtengo uno de estos para cada nombre de archivo que comienza con "-".

DEV0041:scripts n$ ./truncate.sh
basename: illegal option --  
usage: basename string [suffix]
       basename [-a] [-s suffix] string [...]
dirname: illegal option --  
usage: dirname path
mv: illegal option --  
usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory

Pregunta: ¿Por qué el guión —y solo el guión— produce un error?

¿Y cómo solucionar este problema?

    
pregunta Crowder 23.05.2014 - 01:13

1 respuesta

5

Desde la página del manual para mv , el primer argumento (y posiblemente el segundo) en la línea de comando, si comienza con un - , es una opción y no un archivo. Solo -f | -i | -n son opciones permitidas.

La forma más sencilla es no usar - en un nombre de archivo (confundirá otros programas de la línea de comandos), dado que anteponer - es una solución para otra cosa, simplemente no usaría ese carácter.

Si esta no es una opción, puede volver a escribir los comandos mv como este

mv ./"$f" "${DIRNAME}/${FILENAME:2}"

o (un poco más genérico porque también funciona para rutas absolutas)

mv -- "$f" "${DIRNAME}/${FILENAME:2}"

Otra opción (y es lo que haría para cualquier script de bash más de unas pocas líneas) es escribir en un lenguaje de scripting como perl o python. En este caso, solucionan el problema con sus funciones de movimiento, no pasan los nombres de archivo a mv

    
respondido por el Mark 23.05.2014 - 01:36

Lea otras preguntas en las etiquetas