Bash - for 루프에서 공백이 포함된 문자열 가져오기

Bash - for 루프에서 공백이 포함된 문자열 가져오기

하위 집합의 각 디렉터리에서 작동하는 bash 스크립트를 작성하려고 합니다. 안타깝게도 경로에 공백이 포함되어 있어 이름을 변경할 수 없습니다.

루프는 for모든 공간에서 중단을 요구합니다. 수십 가지 변형을 시도했지만 해결책을 찾을 수 없습니다.

단순화된 버전은 다음과 같습니다.

#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
for file in `ls -d "$SOURCE"/201*`
do
    echo "File: $file"
done

/Volumes/Time Machine Backups/Backups.backupdb/Zaphod/2017-06-30-215735예를 들어 별도의 변수에서 각 항목을 가져오는 방법을 제안할 수 있는 사람이 있나요 ?

답변1

최소한으로 변경되는 솔루션은 다음과 같습니다.

#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
for file in "$SOURCE"/201*
do
    echo "File: $file"
done

다른 옵션(위치 매개변수를 변경하는 것이 문제가 되지 않는 경우):

#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
set -- "$SOURCE"/201*
for file; do
    echo "File: $file"
done

보다 정확한 솔루션은 디렉토리를 피하고 공백이 있는 파일을 처리합니다(개행은 아님).

ls -dp "$a"/201* | grep -v '/$' | 
    while read f; do echo "File:$f"; done

또는 모든 이름에 대해 작동하지만 도트 파일도 나열할 수 있는 솔루션(이름이 일치하는 경우):

find "$a" -type f -name "201*" -exec echo "File: {}" \;

답변2

디렉터리의 파일에 공백이 없는 경우:

#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
cd "$SOURCE"
for file in $(ls -d ./201*)
do
    echo "File: $file"
done

디렉토리 목록에 공백이 있는지 확실하지 않은 경우 다음을 수행하십시오.

#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
cd "$SOURCE"
shopt -s nullglob
for filename in 201*;do
   if [[ ! -d "$filename" ]];then
      echo "$filename"
   fi
done
shopt -u nullglob

디렉토리 파일 이름을 원하는지 확실하지 않습니다. 그렇지 않은 경우 이것이 작동합니다.

나는 공백이 있는지 모를 때 일반적으로 두 번째 방법이 선호되는 솔루션이라고 생각합니다.

관련 정보