Czy ktokolwiek może zalecić bezpieczne rozwiązanie rekurencyjnego zastępowania spacji znakami podkreślenia w nazwach plików i katalogów zaczynającymi się od danego katalogu głównego? Na przykład:
$ tree
.
|-- a dir
| `-- file with spaces.txt
`-- b dir
|-- another file with spaces.txt
`-- yet another file with spaces.pdf
staje się:
$ tree
.
|-- a_dir
| `-- file_with_spaces.txt
`-- b_dir
|-- another_file_with_spaces.txt
`-- yet_another_file_with_spaces.pdf
linux
bash
whitespace
filenames
armandino
źródło
źródło
foo bar
i inny plikfoo_bar
?Odpowiedzi:
Użyj
rename
(akaprename
), który jest skryptem Perla, który może już być w twoim systemie. Zrób to w dwóch krokach:Oparty na odpowiedzi Jürgena i zdolny do obsługi wielu warstw plików i katalogów w jednym powiązaniu za pomocą wersji „Revision 1.5 1998/12/18 16:16:31 rmb1”
/usr/bin/rename
(skrypt Perla):źródło
rename
podręcznika (nie znałem narzędzia) i myślę, że możesz zoptymalizować kod, zmieniającs/ /_/g
nay/ /_/
;-)brew install rename
Używam:
Chociaż nie jest rekurencyjny, jest dość szybki i prosty. Jestem pewien, że ktoś tutaj mógłby go zaktualizować, by był rekurencyjny.
${f// /_}
Część wykorzystuje mechanizm ekspansji parametr bash, by zastąpić wzór w parametrze z dostarczonego łańcucha. Odpowiednia składnia to${parameter/pattern/string}
. Zobacz: https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html lub http://wiki.bash-hackers.org/syntax/pe .źródło
rename
, a zainstalowanie go za pomocą naparu jest zbyt trudne)for d in *\ *; do mv "$d" "${d// /}"; done
non under score.shopt -s globstar
ifor f in **/*\ *; do ...
.globstar
Opcja jest wewnętrzny do bash, podczas gdyrename
polecenie jest powszechnym narzędziem Linux i nie jest częścią bash.${f// /_}
jest rozszerzeniem zmiennej Bash do wyszukiwania i zamiany . - Jestf
to zmienna zfor
pętli dla każdego pliku zawierającego spację. - Pierwszy//
oznacza „zamień wszystko” (nie przestawaj przy pierwszym wystąpieniu). - Zatem `/ _` oznacza„ zamień spację na podkreślnik ”na początku nie udało mi się tego zrobić, ponieważ nie myślałem o katalogach.
źródło
IFS=''
przedread
. Ponadto, co mogę powiedzieć w innych komentarzach,sort
krok można pominąć na korzyść-depth
opcjifind
.\
(ukośnik odwrotny). Można to naprawić, dodając-r
opcję czytania.rename
polecenia sugerowanego przez Dennisa.macports
maszrename
? Nigdy nie zadałem sobie trudu, aby się tego dowiedzieć, ponieważ nie sądzę, aby zadanie to uzasadniało użyteczność. A jeśli nie maszmacports
, powinieneś rozważyć ich zainstalowanie;)możesz użyć
detox
przez Douga Harpleźródło
Find / rename rozwiązanie. zmiana nazwy jest częścią util-linux.
Najpierw musisz zejść głębią, ponieważ nazwa pliku białych znaków może być częścią katalogu białych znaków:
źródło
bash 4.0
źródło
a' to a subdirectory of itself,
a / a ')/dev/null
.mv
pięćdziesięciu pięciu tysięcy razy tylko w celu zmiany nazwy czterech plików może być trochę narzutem, nawet jeśli nie zaleją użytkownika wiadomościami.for file in *' '*
lub niektórzy z nich nie wykonaliby lepszej pracy?możesz użyć tego:
źródło
Rekurencyjna wersja Odpowiedzi Naidima.
źródło
Oto (dość pełne) rozwiązanie find -exec, które zapisuje ostrzeżenia „plik już istnieje” do stderr:
źródło
Ten robi trochę więcej. Używam go do zmiany nazwy pobranych torrentów (bez znaków specjalnych (spoza ASCII), spacji, wielu kropek itp.).
źródło
Znalazłem wokół tego skryptu, może być ciekawie :)
źródło
Oto rozsądne rozwiązanie skryptu bash
źródło
ls
.Dla tych, którzy zmagają się z tym za pomocą macOS, najpierw zainstaluj wszystkie narzędzia:
Następnie, gdy trzeba zmienić nazwę, utwórz alias dla GNU find (gfind) jako find. Następnie uruchom kod @Michel Krelin:
źródło
To tylko wyszukuje pliki w bieżącym katalogu i zmienia ich nazwy . Mam to aliasy.
find ./ -name "* *" -type f -d 1 | perl -ple '$file = $_; $file =~ s/\s+/_/g; rename($_, $file);
źródło
Po prostu robię jeden do własnych celów. Możesz użyć go jako odniesienia.
źródło
Dla plików w folderze o nazwie / files
źródło
Moim rozwiązaniem tego problemu jest skrypt bash:
po prostu wpisz nazwę katalogu, do którego chcesz zastosować skrypt, jako argument po wykonaniu skryptu.
źródło
Tak jak wybrana odpowiedź.
źródło