Użyj tego z bash
:
find $1 -name "* *.xml" -type f -print0 | \
while read -d $'\0' f; do mv -v "$f" "${f// /_}"; done
find
wyszuka pliki ze spacją w nazwie. Nazwy plików zostaną wydrukowane z nullbyte ( -print0
) jako separatorem, aby poradzić sobie również ze specjalnymi nazwami plików. Następnie read
wbudowany odczytuje nazwy plików rozdzielone przez nullbyte i ostatecznie mv
zastępuje spacje znakiem podkreślenia.
EDYCJA: Jeśli chcesz usunąć spacje również w katalogach, jest to trochę bardziej skomplikowane. Nazwy katalogów są zmieniane, a następnie niedostępne dla find
znalezisk nazw . Spróbuj tego:
find -name "* *" -print0 | sort -rz | \
while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
sort -rz
Odwraca kolejność plików, tak że najgłębsze pliki w folderze są pierwszymi, aby przenieść i sam folder będzie ostatni. Dlatego nigdy nie zmieniano nazw folderów, zanim wszystkie pliki i foldery nie zostaną w nim zmienione. mv
Polecenia w pętli jest nieco zmienił też. W nazwie docelowej usuwamy tylko spacje w nazwie basenu pliku, w przeciwnym razie nie byłby dostępny.
find . -name "* *" -print0 | sort -rz | \ while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
Za pomocą
rename
lub z
$1
Za pomocą
mv
lub z
$1
źródło
Jest to metoda, którą znalazłem, mając do czynienia z tym samym problemem:
Pisałem plik skryptu bash, aby automatycznie aktualizować moje certyfikaty ssl.
źródło
Użyj
rename
:Nie ma potrzeby
find
:)źródło