올바른 용어를 사용하여 파일 이름을 바꾸기 위해 해당 문자를 찾거나 제거하는 방법을 묻거나 BASH 스크립트를 사용하지 않고 제거하여 다른 형식 문자를 제거할 수 있도록 "인쇄할 수 없는" 문자를 무엇이라고 합니까?
이것은 제가 사용하고 있는 스크립트이지만 원하는 결과를 얻지 못하고 있습니다.
#!/bin/bash
typeset -i count
let count=0
working_dir="/home/userx/temp/"
script_dir="/home/userx/temp/"
MAXFILES="$(find "$working_dir" -type f | wc -l)"
find "$working_dir" -type f | while [[ $count -ne '3' ]] ;
do read FILENAME;
w=$FILENAME
xpath=${w%/*}
xbase=${w##*/}
xfext=${xbase##*.}
xpref=${xbase%.*}
path=${xpath}
pref=${xpref}
ext=${xfext}
echo "extions is : $ext" echo
if [[ "$ext" == 'mp3' ]] ; then
echo "$ext" echo
pref=$(tr -dc '[[:print:]]' <<< "$pref")
## holds on to normal chars rids the rest
# pref=${pref//[^A-Za-z&0-9 ]/ }
echo "new title is -> $pref"
sleep 2
#file=${FILENAME##*/}
# Newfile=${file%_*}
# echo " mv -v "$working_dir"/"$file" "$working_dir"/"$Newfile" "
(( count++ ))
fi
done
결과는 이렇습니다
[userx@voided temp]$ ./Justrenamefiles
max file is : 311
FILENAME IS: /home/userx/temp/Joy Division - Ceremony (Graveyard Studios, Prestwich - Previously
extions is : Joy Division - Ceremony (Graveyard Studios, Prestwich - Previously echo
FILENAME IS: unreleased).mp3
extions is : mp3
**new title is -> unreleased)**
보시다시피 너무 많은 파일 이름이 제거되었습니다. 스크립트에서 두 가지 방법을 모두 시도했지만 이제 하나는 주석 처리되어 있으며 여전히 원하는 결과를 얻지 못합니다.
내가 원하는 결과를 얻기 위해 어떤 코드 조각을 사용할 수 있는지 아는 사람이 있나요?
답변1
이 그래픽은 유니코드 값이 000A(16진수)인 문자를 나타냅니다. 이것은줄바꿈(LF)문자, 개행 문자.
Linux에서는 파일 이름에 개행 문자를 허용하지만 이는 매우 드문 경우입니다. 쉘 스크립트에서 개행 문자를 사용하여 파일 이름을 처리할 수 있지만 특별한 주의가 필요합니다. 스크립트가 구문 분석하는 출력 find
이며, 이 출력은 줄 바꿈을 사용하여 항목을 구분하므로 이 방법은 본질적으로 파일 이름의 줄 바꿈을 처리할 수 없습니다.
스크립트가 필요한 것보다 훨씬 더 복잡합니다. 일을 단순하게 유지하면 효과가 있을 것입니다. 일반적으로 모든 것을 텍스트 스트림으로 압축하고 다시 구문 분석하는 대신 데이터가 있을 때 해당 데이터에 대해 작업하십시오.
사용하면 find
출력이 구문 분석되지 않습니다. 작업을 사용합니다 -exec
.
이 이름 바꾸기를 수행하는 가장 쉬운 방법은 (개행을 공백으로 바꾸겠습니다) 다음과 같습니다.다루기 힘든, 그 덕분에zmv
기능.
autoload -U zmv # put this in your .zshrc
cd $working_dir
zmv '**/*' $'${f//\n/ }'
비임베디드 Linux에 항상 사전 설치되어 있는 프로그램을 계속 사용해야 하는 경우 bash를 사용하여 이름을 바꾸는 간단한(약간 느리긴 하지만) 방법이 있습니다.
find "$working_dir" -type f -name '*
*' -exec bash -c 'mv "$0" "${0//
/ }"' {} \;
배치 파일에서 bash를 호출하면 작업 속도를 높일 수 있습니다.
find "$working_dir" -type f -name '
' -exec bash -c 'for x; do mv "$x" "${x//
/ }"' _ {} +
Linux에 개행 문자가 하나만 있는 경우 다음을 사용할 수 있습니다.rename
명령( rename.ul
Debian 및 그 파생 제품에서 호출됨).
find "$working_dir" -type f -name '
' -exec rename '
' ' ' {} +
당신이 가지고 있다면prename
:
find "$working_dir" -type f -name '
' -exec prename 'y/\n/ /' {} +
답변2
문제는 파일 이름에 개행 문자(예: )가 포함되어 있고 aaa\nbbb
메서드 find | read
가 이를 파일 aaa
및 와 구별할 수 없다는 것입니다 bbb
.
일반적인 대답은 find
nul 문자를 사용하여 개별 파일 이름을 가져온 다음 . nul 문자를 줄 구분 기호로 사용하고, 백슬래시 처리를 중지하고, 시작과 끝의 공백을 유지하도록 read에 지시합니다.\0
find -print0
IFS= read -r -d '' FILENAME
-d ''
-r
IFS=