파일 이름에서 000A 문자 제거

파일 이름에서 000A 문자 제거

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

올바른 용어를 사용하여 파일 이름을 바꾸기 위해 해당 문자를 찾거나 제거하는 방법을 묻거나 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.ulDebian 및 그 파생 제품에서 호출됨).

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.

일반적인 대답은 findnul 문자를 사용하여 개별 파일 이름을 가져온 다음 . nul 문자를 줄 구분 기호로 사용하고, 백슬래시 처리를 중지하고, 시작과 끝의 공백을 유지하도록 read에 지시합니다.\0find -print0IFS= read -r -d '' FILENAME-d ''-rIFS=

관련 정보