디렉토리에서 특수 문자와 공백이 포함된 모든 파일의 이름을 바꾸는 방법은 무엇입니까?

디렉토리에서 특수 문자와 공백이 포함된 모든 파일의 이름을 바꾸는 방법은 무엇입니까?

파일 이름에 공백과 특수 문자($ 및 @)가 포함된 특정 디렉터리의 모든 파일 이름을 바꾸는 방법은 무엇입니까?

rename다음을 사용하여 모든 공백과 특수 문자를 _로 바꾸려고 했습니다 .

$ ls -lrt
total 464
-rwxr-xr-x. 1 pmautoamtion pmautoamtion 471106 Jul 17 13:14 Bharti Blocked TRX Report [email protected]


$ rename -n 's/ |\$|@/_/g' *
$ ls -lrt
total 464
-rwxr-xr-x. 1 pmautoamtion pmautoamtion 471106 Jul 17 13:14 Bharti Blocked TRX Report [email protected]
$

명령은 작동하지만 파일 이름을 변경하지 않으며 오류를 반환하지 않습니다. 이 문제를 해결하는 방법과 다른 방법이 있나요?

답변1

플래그 -n

--조치 없음

작업 없음: 이름이 바뀔 파일을 표시합니다.

따라서 아무것도 변경하지 않으면 이는 정상입니다.

귀하의 명령과 관련하여 그것은 나에게 효과적이었습니다.

$ touch "a @ test"
$ ls
a @ test
$ rename -n 's/ |\$|@/_/g' *
a @ test renamed as a___test

어쩌면 쉘에 따라 이스케이프해야 할 수도 있습니다 |

$ rename -n 's/ \|\$\|@/_/g' *

또는 […]기호를 사용하여 문자를 그룹화할 수 있습니다.

$ rename -n 's/[ @\$]/_/g' *

답변2

다음을 시도해 볼 수 있습니다.

for file in ./*Block*                                       
do echo mv "$file" "${file//[ ()@$]/_}"
done

결과가 만족스러우면 echo이전 콘텐츠를 삭제하여 mv실제로 파일 이름을 바꾸세요.

답변3

특수 문자와 독일어 특수 문자를 제거하고 유용한 정보를 제거하지 않도록 범용 문자로 바꾸는 멋진 스크립트를 찾고 있습니다. 몇 가지 사소한 문제가 발생한 스크립트의 마지막 버전을 업데이트했습니다.

#!/bin/bash

for file in ./*
do
  infile=`echo "${file:2}"|sed  \
         -e 's|"\"|"\\"|g' \
         -e 's| |\ |g' -e 's|!|\!|g' \
         -e 's|@|\@|g' -e 's|*|\*|g' \
         -e 's|&|\&|g' -e 's|]|\]|g' \
         -e 's|}|\}|g' -e 's|"|\"|g' \
         -e 's|,|\,|g' -e 's|?|\?|g' \
         -e 's|=|\=|g'  `
  outfileNOSPECIALS=`echo "${file:2}"|sed -e 's|[^A-Za-z0-9._-]|_|g'`
  outfileNOoe=`echo $outfileNOSPECIALS| sed -e 's|ö|oe|g'`
  outfileNOae=`echo $outfileNOoe| sed -e 's|ä|ae|g'`
  outfileNOue=`echo $outfileNOae| sed -e 's|ü|ue|g'`
  outfileNOOE=`echo $outfileNOue| sed -e 's|Ö|OE|g'`
  outfileNOAE=`echo $outfileNOOE| sed -e 's|Ä|AE|g'`
  outfileNOUE=`echo $outfileNOAE| sed -e 's|Ü|UE|g'`
  outfileNOss=`echo $outfileNOUE| sed -e 's|ß|ss|g'`
  outfile=${outfileNOss}
  if [ "$infile" != "${outfile}" ]
  then
        echo "filename changed for " $infile " in " $outfile
        mv "$infile" ${outfile}
  fi
done

exit

다음으로 이어진다:

여기에 이미지 설명을 입력하세요.

@don_crissti: Linux가 파일 이름을 이동할 때 특수 문자를 처리하는 데 문제가 있기 때문에 그는 infile에서 hokus-pokus를 수행하고 있습니다.

답변4

알 수 없는 이유로 해당 rename명령이 작동하지 않았고 내 질문에 대한 다른 답변을 얻지 못했기 때문에 이름 변경이 가능하도록 최선을 다했습니다. 이것이 파일 이름을 바꾸는 가장 좋은 방법은 아닐 수도 있지만 저에게는 효과가 있었습니다. 그래서 이 글을 읽는 다른 사람들이 제가 한 것처럼 파일 이름을 변경하는 데 도움이 될 수 있도록 답변으로 게시하고 싶었습니다.

이제 나는 모든 파일의 이름에 "block"이라는 단어라는 특정 텍스트가 있다는 것을 알고 있습니다. 이름을 바꾸기 전의 파일 이름은 다음과 같습니다.

anks@anks:~/anks$ ls -lrt
total 4
-rw-r--r-- 1 anks anks   0 Jul 25 14:47 Bharti TRX Block [email protected]
-rw-r--r-- 1 anks anks   0 Jul 25 14:47 Bharti TRX Block [email protected]
-rw-r--r-- 1 anks anks   0 Jul 25 14:47 Bharti TRX Block [email protected]
-rw-r--r-- 1 anks anks   0 Jul 25 14:47 Bharti TRX Block [email protected]
-rw-r--r-- 1 anks anks   0 Jul 25 14:48 Bharti TRX Block [email protected]

이제 이를 달성하기 위해 작은 쉘 스크립트를 작성했습니다. 코드는 다음과 같습니다.

#!/bin/bash

PATH="/home/ebfijjk/anks"

# Put the old filenames in a file.
ls $PATH | grep Block >> oldValues

# Put the new names without " " or "@" or "$" in another file
cat oldValues | sed 's/\$/_/g' | sed 's/\@/_/g' | sed 's/ /_/g' >> newValues

# Create a new file with Old names and New names seperated by a #.
paste -d'#' oldValues newValues >> oldAndNew

# Read the file with both old and new names and rename them with the new names.
while IFS='#'; read oldValue newValue
do
    mv "$oldValue" "$newValue"

done < oldAndNew

rm oldValues newValues oldandNew

그게 전부입니다. 스크립트를 실행하면 공백( ) 또는 $해당 문자 대신에 포함된 모든 @파일 이름 이 변경됩니다._

관련 정보