[linux] bash 스크립트를 사용하여 파일 이름의 공백을 바꾸는 방법

주어진 루트 디렉토리에서 시작하여 파일 및 디렉토리 이름에서 공백을 밑줄로 재귀 적으로 대체하는 안전한 솔루션을 추천 할 수 있습니까? 예를 들면 다음과 같습니다.

$ 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



답변

시스템에 이미있을 수있는 Perl 스크립트 인 rename(aka prename)를 사용하십시오 . 두 단계로 수행하십시오.

find -name "* *" -type d | rename 's/ /_/g'    # do the directories first
find -name "* *" -type f | rename 's/ /_/g'

Jürgen의 답변을 바탕으로 ” /usr/bin/renamePerl 스크립트 “의 “Revision 1.5 1998/12/18 16:16:31 rmb1″버전을 사용하여 단일 계층에서 여러 계층의 파일과 디렉토리를 처리 할 수 ​​있음

find /tmp/ -depth -name "* *" -execdir rename 's/ /_/g' "{}" \;


답변

나는 사용한다:

for f in *\ *; do mv "$f" "${f// /_}"; done

재귀 적이지는 않지만 매우 빠르고 간단합니다. 여기 누군가가 재귀 적으로 업데이트 할 수 있다고 확신합니다.

${f// /_}부분 문자열 공급 파라미터 내에 패턴을 교체 떠들썩한 파티 파라미터의 팽창기구를 이용한다. 관련 구문은 ${parameter/pattern/string}입니다. 참조 : https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html 또는 http://wiki.bash-hackers.org/syntax/pe .


답변

find . -depth -name '* *' \
| while IFS= read -r f ; do mv -i "$f" "$(dirname "$f")/$(basename "$f"|tr ' ' _)" ; done

디렉토리를 생각하지 않았기 때문에 처음에는 제대로하지 못했습니다.


답변

detoxDoug Harple에서 사용할 수 있습니다

detox -r <folder>


답변

찾기 / 이름 바꾸기 솔루션입니다. rename 은 util-linux의 일부입니다.

공백 파일 이름이 공백 디렉토리의 일부일 수 있으므로 먼저 깊이를 내림차순으로 내려야합니다.

find /tmp/ -depth -name "* *" -execdir rename " " "_" "{}" ";"


답변

배쉬 4.0

#!/bin/bash
shopt -s globstar
for file in **/*\ *
do
    mv "$file" "${file// /_}"
done


답변

이것을 사용할 수 있습니다 :

    find . -name '* *' | while read fname

do
        new_fname=`echo $fname | tr " " "_"`

        if [ -e $new_fname ]
        then
                echo "File $new_fname already exists. Not replacing $fname"
        else
                echo "Creating new file $new_fname to replace $fname"
                mv "$fname" $new_fname
        fi
done