쉘 스크립트를 사용하여 Linux에서 모든 파일 이름의 공백을 밑줄로 바꾸는 방법은 무엇입니까?

쉘 스크립트를 사용하여 Linux에서 모든 파일 이름의 공백을 밑줄로 바꾸는 방법은 무엇입니까?

모든 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

  1. 사용rename

    find . -type f -name "* *.xml" -exec rename "s/\s/_/g" {} \;
    

    또는$1

    find "$1" -type f -name "* *.xml" -exec rename "s/\s/_/g" {} \;
    
  2. 사용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:)

관련 정보