2013-09-25 8 views
6

Ho un progetto sulla mia macchina Linux che contiene file con caratteri considerati illegali/riservati in Windows (http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx). Il progetto ha oltre 10.000 file in diverse cartelle e io dovrò identificare il percorso di questi file.Trova i file con caratteri Windows illegittimi nel nome su Linux

posso find . -name "*\?*" per ciascuno dei personaggi illegali/riservati, ma c'è un modo più semplice per trovare tutti i file che contengono < > : "/\ | ? *

Una volta che ho identificato, vorrei rimuovere tutti questi personaggi da ciascuno di questi file.

risposta

9

Questa trovare uno-liner dovrebbe funzionare per voi:

find . -name "*[<>:\\|?*]*" -exec bash -c 'x="{}"; y="$(sed "s/[<>:\\|?*]\+/-/g" <<< "$x")" && mv "$x" "$y" ' \; 
+0

Grazie mille amico! –

+0

anubhava, c'è un modo per applicare anche mv alle cartelle? –

+0

Il comando precedente lo farebbe per file e cartelle, credo entrambi. – anubhava

9

fnmatch modello consentono di specificare che i caratteri in [] come segue:

find . -name '*[<>:/\\|?*]*' 
+0

Grazie! Posso concatenare un comando xargs per rinominare questi file, rimuovere quei caratteri e sostituirli con, diciamo a - (trattino)? –

+1

Ho dovuto modificare le virgolette doppie per trovare il backslash – wjandrea

+0

@wjandrea, grazie per il vostro feedback. Ho aggiornato il codice di conseguenza. – falsetru

0

Nessuna delle risposte sopra trovano file o directory terminato in uno spazio ('') o punto/punto ('.') che non sono visibili anche con l'API Win32.

Aggiungendo a .e.g @ di falsetru risposta, si potrebbe fare

find . -name '*[<>:/\\|?*]*' -o -name '*[ \.]' 
Problemi correlati