Rinomina o elimina la massa in Linux

Ho un mazzo (circa 10 gigs worth) di file che devo copiare da un disco linux esterno a una macchina Windows. Purtroppo alcuni nomi di file che contengono il carattere ":" sono stati inseriti in questa raccolta.

Nessuno di questi file del colon deve essere sulla macchina di Windows quindi ho bisogno di una soluzione rapida per zap o rinominarli.

  • `Permesso negato` nel CD in una directory anche se le autorizzazioni sono corrette
  • debugger in bash
  • PHP non chiude TCP CLOSE_WAIT sul server web
  • Caricare le variables di ambiente degli utenti in un cronjob
  • Avvio di PHP: il database di orario è danneggiato
  • 5 secondi ritardi di risoluzione
  • Cosa consiglierebbe? (Sto assumendo qualcosa come un bash / perl / python script in Linux. Non abbiamo powershell sulla macchina Windows.)

  • Che cosa è un buon strumento di ricerca / sostituzione di massa per le windows?
  • 7 Solutions collect form web for “Rinomina o elimina la massa in Linux”

    Esaminare i file offendenti.

    find /path/to/files -name '*:*' -print 

    Eliminare i file offendenti.

     find /path/to/files -name '*:*' -exec rm {} + 

    Rinominare i file offensivi con un sottolineatura.

     find /path/to/files -name '*:*' -exec rename ':' '_' {} + 

    Per una versione più efficiente di Dan C è ansible eliminare alcune versioni UNIX:

     find /path/to/files -name '*:*' -delete 

    questo evita la necessità di fork e exec /bin/rm per each singolo file di corrispondenza.

    Questa opzione di -delete è presente su MacOS X e sul mio sistema FC11 (con findutils-4.4.0 ). Non so quanto tempo sia stato aggiunto a findutils .

    È ansible eliminare tutti i file facendo

     rm *:* 

    nella directory sulla casella Linux.

    Questo dovrebbe eliminare tutti i file che contengono il colon.

    Oppure è ansible rinominarli utilizzando il command di ridenominazione

     rename 'y/(.*):(.*)/$1$2/' * 

    Questo sostituirà il test: qualcosa che deve essere qualcosa di testato

    Il modo più semplice potrebbe essere quello di ricall la struttura intera e di estrarre il file sul disco di Windows. La function Unzip sa come rimodellare i caratteri illegali.

    Richiede di avere lo spazio su disco però 🙁

    Se si desidera modificare i nomi di file in volo (non modificando la directory di origine), GNU tar ha un'opzione –transform.

     tar cf - -C $SOURCE_DIR . --transform=s/:/_/g | tar xf - -C $DEST_DIR 

    Potresti anche usare l'opzione –exclude per evitare questi file.

     tar cf - -C $SOURCE_DIR . --exclude='*:*' | tar xf - -C $DEST_DIR 

    Non vedo l'opzione –transform sulle macchine RHEL5 where lavoro, ma penso che sia abbastanza comune altrimenti.

    Anche,

    mmv ";*:*" "#1#2#3"

    o un command simile dovrebbe anche fare il trucco. Eseguirlo con -vv in primo luogo, solo per vedere cosa verrà spostato a ciò, senza modificare nulla

    Questo dovrebbe veramente essere un commento sulla risposta più scelta, ma non posso (ancora) applicare un commento.

    Ho questa versione di rinominare su un sistema Debian jessie.

     $ rename -V /usr/bin/rename using File::Rename version 0.20 

    Sono riuscito a rinominare utilizzando:

     find . -name '*:*' -exec rename 's/:/_/g' {} \; 

    Tuttavia, vi è un effetto collaterale. I timestamp su tutti i file sono stati modificati.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.