주어진 루트 디렉토리에서 시작하여 파일 및 디렉토리 이름에서 공백을 밑줄로 재귀 적으로 대체하는 안전한 솔루션을 추천 할 수 있습니까? 예를 들면 다음과 같습니다.
$ 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/rename
Perl 스크립트 “의 “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
디렉토리를 생각하지 않았기 때문에 처음에는 제대로하지 못했습니다.
답변
detox
Doug 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