Как заменить пробелы в именах файлов, используя скрипт bash - PullRequest
233 голосов
/ 25 апреля 2010

Кто-нибудь может порекомендовать безопасное решение для рекурсивной замены пробелов символами подчеркивания в именах файлов и каталогов, начиная с заданного корневого каталога? Например:

$ tree
.
|-- a dir
|   `-- file with spaces.txt
`-- b dir
    |-- another file with spaces.txt
    `-- yet another file with spaces.pdf

становится:

$ tree
.
|-- a_dir
|   `-- file_with_spaces.txt
`-- b_dir
    |-- another_file_with_spaces.txt
    `-- yet_another_file_with_spaces.pdf

Ответы [ 16 ]

1 голос
/ 28 ноября 2011

Я нашел вокруг этого скрипта, это может быть интересно:)

 IFS=$'\n';for f in `find .`; do file=$(echo $f | tr [:blank:] '_'); [ -e $f ] && [ ! -e $file ] && mv "$f" $file;done;unset IFS
1 голос
/ 28 февраля 2011

Вот решение bash-скрипта разумного размера

#!/bin/bash
(
IFS=$'\n'
    for y in $(ls $1)
      do
         mv $1/`echo $y | sed 's/ /\\ /g'` $1/`echo "$y" | sed 's/ /_/g'`
      done
)
0 голосов
/ 04 сентября 2017

Для тех, кто борется с этим с помощью macOS, сначала установите все инструменты:

 brew install tree findutils rename

Затем, когда необходимо переименовать, создайте псевдоним для GNU find (gfind) как find. Затем запустите код @Michel Krelin:

alias find=gfind 
find . -depth -name '* *' \
| while IFS= read -r f ; do mv -i "$f" "$(dirname "$f")/$(basename "$f"|tr ' ' _)" ; done   
0 голосов
/ 05 декабря 2016

Для файлов в папке с именем / files

for i in `IFS="";find /files -name *\ *`
do
   echo $i
done > /tmp/list


while read line
do
   mv "$line" `echo $line | sed 's/ /_/g'`
done < /tmp/list

rm /tmp/list
0 голосов
/ 26 сентября 2014

Я просто делаю один для своих собственных целей. Вы можете использовать его для справки.

#!/bin/bash
cd /vzwhome/c0cheh1/dev_source/UB_14_8
for file in *
do
    echo $file
    cd "/vzwhome/c0cheh1/dev_source/UB_14_8/$file/Configuration/$file"
    echo "==> `pwd`"
    for subfile in *\ *; do [ -d "$subfile" ] && ( mv "$subfile" "$(echo $subfile | sed -e 's/ /_/g')" ); done
    ls
    cd /vzwhome/c0cheh1/dev_source/UB_14_8
done
0 голосов
/ 22 ноября 2011

Только находит файлы в текущем каталоге и переименовывает их . У меня есть этот псевдоним.

find ./ -name "* *" -type f -d 1 | perl -ple '$file = $_; $file =~ s/\s+/_/g; rename($_, $file);

...