Scripting della shell: Perché solo il trattino "-" genera un errore?

2

Obiettivo: pulizia

Tronca selettivamente i nomi di file nella mia cartella delle note di nvALT. Ho provato a utilizzare il suggerimento di un blogger di produttività (che mi sfugge dopo una ricerca approfondita) per anteporre ^ > - + a nomi di file, ma non funziona per me. È ora di pulire casa! Tuttavia, ho bisogno di assicurarmi di non perdere i caratteri alfa sui nomi di file che non usano quei prefissi. Inoltre sto imparando lo scripting e penso sia divertente!

Script di shell

Ecco cosa ho:

#!/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: il trattino

Ecco l'input da riga di comando e il messaggio di errore. Ne ricevo uno per ciascun nome di file che inizia 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

Domanda: Perché il trattino-e solo il trattino-genera un errore?

E come risolvere questo problema?

    
posta Crowder 23.05.2014 - 01:13
fonte

1 risposta

5

Dalla pagina man per mv , il primo (e possibilmente secondo) argomento sulla riga di comando, se inizia con - , è un'opzione e non un file. Solo -f | -i | -n sono opzioni consentite.

Il modo più semplice è di non utilizzare - nel nome di un file: confonderà altri programmi della riga di comando, dato che la prepending - è una soluzione alternativa per qualcos'altro che non utilizzerei semplicemente quel carattere.

Se questa non è un'opzione, puoi riscrivere i comandi mv come questo

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

o (un po 'più generico perché funziona anche per i percorsi assoluti)

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

Un'altra opzione (ed è quello che farei per qualsiasi script bash più lungo di poche righe) è scrivere in un linguaggio di scripting come perl o python - in questo caso risolvono il problema con le loro funzioni di spostamento che non passano i nomi dei file in mv

    
risposta data 23.05.2014 - 01:36
fonte

Leggi altre domande sui tag