2 votos

Shell scripting: ¿por Qué sólo el "-" guión tirar un error?

Objetivo: Limpiar

Selectivamente truncar los nombres de archivo en mi nvALT de la carpeta de notas. He intentado utilizar una productividad de blogger sugerencia (que se me escapa después de una búsqueda exhaustiva) anteponer ^ > - + a los nombres de archivo, pero no funciona para mí. Es hora de limpiar la casa! Sin embargo, es necesario asegurarse de que yo no lop off alfa caracteres en los nombres de archivos que no se utilizan los prefijos. Además yo soy el aprendizaje de secuencias de comandos y creo que es divertido!

Secuencia de comandos de Shell

Aquí 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 comandos y mensajes de error. Puedo conseguir uno de estos para cada nombre de archivo que comienzan 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 sólo el guión de tiro un error?

Y cómo solucionar este problema?

5voto

yoliho Puntos 340

Desde la página man de mv, la primera (y posiblemente de segundo) argumento en la línea de comandos, si se comienza con un -, es una opción y no un archivo. Sólo -f | -i | -n se permiten opciones.

Forma más sencilla es no usar - en un nombre de archivo-confundir a otros programas de línea de comandos-dado que anteponiendo - es una solución para algo más que no sólo el uso de ese carácter.

Si esto no es una opción, se puede reescribir la mv comandos como este

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

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

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

Otra opción (y es lo que yo haría para cualquier script de bash más de un par de líneas) es escribir en un lenguaje de programación como perl o python - en este caso resolver el problema por su cambio de funciones no pasa de los nombres de archivo a mv

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X