모든 XML 파일 이름의 공백을 바꿔야 하는 다음 쉘 스크립트를 시도했습니다.
for xml_file in $(find $1 -name "* .xml" -type f);
do
echo "removing spaces from XML file:" $xml_file
mv "$xml_file" "${xml_file// /_}";
done
xml 파일이 있다고 가정하면 xy z.xml
다음과 같은 결과가 나타납니다.
removing spaces from XML file: /home/krishna/test/xy
mv: cannot stat `/home/krishna/test/xy': No such file or directory
removing spaces from XML file: .xml
mv: cannot stat `z.xml': No such file or directory
답변1
다음과 함께 사용하세요 bash
.
find $1 -name "* *.xml" -type f -print0 | \
while read -d $'\0' f; do mv -v "$f" "${f// /_}"; done
find
이름에 공백이 포함된 파일이 검색됩니다. 파일 이름은 -print0
특수 파일 이름을 처리하기 위한 구분 기호로 널 바이트( )를 사용하여 인쇄됩니다. 그런 다음 내장 함수는 read
널 바이트로 구분된 파일 이름을 읽고 마지막으로 mv
공백을 밑줄로 바꿉니다.
편집하다:디렉토리에서 공백도 제거하려면 좀 더 복잡합니다. 디렉터리 이름이 바뀌면 더 이상 find
이름 조회를 통해 액세스할 수 없습니다. 이 시도:
find -name "* *" -print0 | sort -rz | \
while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
sort -rz
폴더의 가장 깊은 파일이 먼저 이동되고 폴더 자체가 마지막으로 이동되도록 파일 순서를 반대로 바꿉니다 . 따라서 폴더 내의 모든 파일과 폴더 이름이 바뀔 때까지는 폴더 이름이 바뀌지 않습니다. mv
루프의 명령에도 일부 변경이 있었습니다. 대상 이름에서는 파일의 기본 이름에 있는 공백만 제거합니다. 그렇지 않으면 파일에 액세스할 수 없습니다.
답변2
사용
rename
find . -type f -name "* *.xml" -exec rename "s/\s/_/g" {} \;
또는
$1
find "$1" -type f -name "* *.xml" -exec rename "s/\s/_/g" {} \;
사용
mv
find . -type f -name "* *.xml" -exec bash -c 'mv "$0" "${0// /_}"' {} \;
또는
$1
find "$1" -type f -name "* *.xml" -exec bash -c 'mv "$0" "${0// /_}"' {} \;
답변3
동일한 문제가 발생했을 때 찾은 내용은 다음과 같습니다.
for f in *; do mv "$f" `echo $f | tr ' ' '_'`; done
SSL 인증서를 자동으로 갱신하기 위해 bash 스크립트 파일을 작성 중입니다.
답변4
사용 rename
:
rename 's/\s/_/g' ./*.xml
불필요 find
:)