파일 이름에 공백이 있는 파일을 나열하는 방법은 무엇입니까? [복사]

파일 이름에 공백이 있는 파일을 나열하는 방법은 무엇입니까? [복사]

아래와 같이 for 루프를 사용하여 함수에 매개변수를 전달하여 파일을 하나씩 읽으려고 합니다. 매개변수 3은 파일 이름에 공백이 있기 때문에 많은 문제를 일으킬 수 있습니다.

예:

source_file_restructure()
{

echo "inside the function"
source_folder=$1
target_folder=$2
file_pattern=$3
delimiter=$4


echo $file_pattern


echo " Getting inside the function.... "


for file_name in `ls -Al ${source_folder}*"${file_pattern}"*.csv`
do

some processing.......

done

위의 ls 명령은 파일에 공백이 포함된 경우(예: 파일 1.csv) 제대로 작동하지 않습니다.

입력하다:

SOurce Folder : /home/test/

File Pattern : "file"

Function argument : 
source_file_restructure ${source_folder} ${target_folder} "${file_pattern}" ${delimiter}

이 문제를 해결하기 위한 몇 가지 옵션을 제안하십시오.

답변1

바꾸다

for file_name in `ls -Al ${source_folder}*"${file_pattern}"*.csv`

그리고:

for file_name in "${source_folder}"*"${file_pattern}"*.csv

위의 첫 번째 형식과 같이 역따옴표 안의 명령 출력은 단어 분리의 영향을 받습니다. 위의 두 번째 형식은 백틱을 사용하지 않습니다. 반면에 공백, 탭, 줄 바꿈 또는 기타 어려운 문자가 포함된 파일 이름을 포함하여 모든 파일 이름을 처리할 수 있습니다.

또한, 교체

source_file_restructure ${source_folder} ${target_folder} "${file_pattern}" ${delimiter}

그리고

source_file_restructure "${source_folder}" "${target_folder}" "${file_pattern}" "${delimiter}"

큰따옴표가 없으면 쉘은 단어 분리를 수행합니다. 큰따옴표를 사용하면 공백, 탭, 줄 바꿈 또는 기타 어려운 문자가 있어도 source_folder함수 가 올바르게 호출됩니다 .target_folder

답변2

첫 번째 스크립트에서 다음 환경 변수를 설정해야 합니다.

IFS=$(echo -en "\n\b")

답변3

내 스크립트 중 하나에서 다음과 같은 것을 사용하고 있습니다.

ls -Q "$folderToRead" | while read file # ls -Q puts every entry between quotes : "file".
do
    file=`echo $file | tr -d '"'` # This erases the quotes from the -Q argument, so you 
                                    # can work on the file without worrying about it.

물론 스크립트에서 실행하려면 ls 명령을 편집해야 합니다. 그냥 짧은 버전으로 썼습니다.

관련 정보