파일 이름에 공백과 특수 문자($ 및 @)가 포함된 특정 디렉터리의 모든 파일 이름을 바꾸는 방법은 무엇입니까?
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
그게 전부입니다. 스크립트를 실행하면 공백( ) 또는
$
해당 문자 대신에 포함된 모든 @
파일 이름 이 변경됩니다._