2013-09-25 6 views
6

Mam projekty na moim Linux-ie, które zawierają plik ze znakami, które są uznawane za nielegalne/zastrzeżone w systemie Windows (http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx). Projekt zawiera ponad 10 000 plików w kilku folderach, a ja wskażę ścieżkę do tych plików.Znajdź pliki z niedozwolonymi znakami Windows w nazwie na Linux

mogę find . -name "*\?*" dla każdego z nielegalnych/zastrzeżonych znaków, ale jest tam łatwiejszy sposób, aby znaleźć wszystkie pliki, które zawierają < > : "/\ | ? *

Raz zidentyfikowaliśmy, chciałbym, aby usunąć wszystkie takie znaki z każdego te pliki.

Odpowiedz

9

Ten wybrać jedną wkładkę powinny pracować dla Ciebie:

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

Wielkie dzięki! –

+0

anubhava, czy istnieje sposób, w jaki mogę zastosować mv również do folderów? –

+0

Powyższe polecenie uczyniłoby to dla plików i folderów, w które wierzę. – anubhava

9

fnmatch wzór pozwala określić, że znaki w [] następujące:

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

Dzięki! Czy mogę powiązać komendę xargs, aby zmienić nazwy tych plików, usunąć te znaki i zastąpić je, powiedzmy a - (kreska)? –

+1

Musiałem zmienić podwójne cudzysłowy na singiel, aby znaleźć ukośnik odwrotny – wjandrea

+0

@wjandrea, Dziękuję za twoją opinię. Odpowiednio zaktualizowałem kod. – falsetru

0

Żadna z powyższych odpowiedzi znajdzie pliki lub katalogi które zakończyło się spacją ('') lub kropką ("."), które nie są również widoczne w Win32 API.

Dodawanie do .e.g @ na falsetru odpowiedź, można zrobić

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